外观模式
概念
外观模式,通过为多个复杂的子系统提供一个一致的接口,使得这些子系统更容易被访问。外部不用关心内部系统的细节,只是使用这个统一的接口就足够了
类图
代码
class Facade
{
//聚合子类对象
private Subsystem1 subsystem1 = new Subsystem1();
private Subsystem2 subsystem2 = new Subsystem2();
private Subsystem3 subsystem3 = new Subsystem3();
//在这里可以调用子类具体的方法
public void Method()
{
subsystem1.Subsystem1Method();
subsystem2.Subsystem1Method();
subsystem3.Subsystem1Method();
}
}
class Subsystem1
{
public void Subsystem1Method()
{
Console.WriteLine("第一个类的方法");
}
}
class Subsystem2
{
public void Subsystem1Method()
{
Console.WriteLine("第二个类的方法");
}
}
class Subsystem3
{
public void Subsystem1Method()
{
Console.WriteLine("第三个类的方法");
}
}
外观模式主要有三个部分构成。分别是
- 外观角色:为多个子系统提供对外接口
- 子系统:系统的部分功能
- 客户:使用外观角色访问子系统功能。
享元模式
概念
使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件;它适合用于只是因重复而导致使用无法令人接受的大量内存的大量物件。通常物件中的部分状态是可以分享。常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元。
类图
代码
internal interface IFlyweight
{
void Operation(int extrinsicstate);
}
//具体享元类
class ConcreteFlyweight : IFlyweight
{
//实现享元类的接口,为内部状态增加存储空间
public void Operation(int extrinsicstate)
{
Console.WriteLine("具体Flyweight" + extrinsicstate);
}
}
//实现享元接口,但并不共享,因为Flyweight不强制共享
class UnsharedConcreteFlywight : IFlyweight
{
public void Operation(int extrinsicstate)
{
Console.WriteLine("不共享的Flyweight:" + extrinsicstate);
}
}
//享元工厂,用来创建和管理Flyweight对象。当用户进行请求时、此类负责
//提供一个已创建的实例或者创建一个
class FlyweightFactory
{
//使用hashTable拉力保存对象
private Hashtable flyweights = new Hashtable();
//初始化添加三个实例
public FlyweightFactory()
{
flyweights.Add("X", new ConcreteFlyweight());
flyweights.Add("Y", new ConcreteFlyweight());
flyweights.Add("Z", new ConcreteFlyweight());
}
//根据客户端请求,获得产生的实例
public IFlyweight GetFlyweight(string key)
{
return ((IFlyweight)flyweights[key]);
}
使用享元模式可以大大降低创建重复对象占用的空间
代理模式
概念
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
类图
internal class Program
{
static void Main(string[] args)
{
Proxy proxy = new Proxy();
proxy.Request(); //调用的实际的请求
}
}
//抽象的接口
abstract class Subject
{
public abstract void Request();
}
//真实请求
class RealSubject : Subject
{
public override void Request()
{
Console.WriteLine("真实的请求");
}
}
//代理类
class Proxy : Subject
{
RealSubject realSubject;
public override void Request()
{
if (realSubject == null)
{
realSubject = new RealSubject();
}
realSubject.Request();
}
}