23种设计模式的定义和应用场景:
单例模式(Singleton)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)、原型模式(Prototype)
适配器模式(Adapter)、桥接模式(Bridge)、组合模式(Composite)、装饰器模式(Decorator)、外观模式(Facade)、享元模式(Flyweight)、代理模式(Proxy)
责任链模式(Chain of Resposibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者模式(Mediator)、备忘录模式(Mementor)、观察者模式(Oberver)、状态模式(State)、策略模式(Strategy)、模板方法模式(Template Method)、访问者模式 (Visitor)
2-结构型模式-C#代码
2. 结构型模式
2.1 适配器模式 (Adapter)
定义 : 将一个类的接口转换成客户希望的另一个接口。
应用场景: 集成第三方库、旧系统升级。
cs
public class Adaptee
{
public void SpecificRequest() => Console.WriteLine("Specific Request");
}
public interface ITarget
{
void Request();
}
public class Adapter : ITarget
{
private Adaptee _adaptee = new Adaptee();
public void Request() => _adaptee.SpecificRequest();
}
2.2 桥接模式 (Bridge)
定义 : 将抽象部分与实现部分分离,使它们可以独立变化。
应用场景: 跨平台应用、图形绘制。
cs
public interface IImplementor
{
void OperationImpl();
}
public class ConcreteImplementorA : IImplementor
{
public void OperationImpl() => Console.WriteLine("ConcreteImplementorA Operation");
}
public abstract class Abstraction
{
protected IImplementor _implementor;
public Abstraction(IImplementor implementor) => _implementor = implementor;
public abstract void Operation();
}
public class RefinedAbstraction : Abstraction
{
public RefinedAbstraction(IImplementor implementor) : base(implementor) { }
public override void Operation() => _implementor.OperationImpl();
}
2.3 组合模式 (Composite)
定义 : 将对象组合成树形结构以表示"部分-整体"的层次结构。
应用场景: 文件系统、UI组件。
cs
public abstract class Component
{
public abstract void Operation();
public virtual void Add(Component component) => throw new NotImplementedException();
public virtual void Remove(Component component) => throw new NotImplementedException();
}
public class Leaf : Component
{
public override void Operation() => Console.WriteLine("Leaf Operation");
}
public class Composite : Component
{
private List<Component> _children = new List<Component>();
public override void Operation() => _children.ForEach(c => c.Operation());
public override void Add(Component component) => _children.Add(component);
public override void Remove(Component component) => _children.Remove(component);
}
2.4 装饰器模式 (Decorator)
定义 : 动态地给对象添加额外的职责。
应用场景: 日志记录、权限检查。
cs
public abstract class Component
{
public abstract void Operation();
}
public class ConcreteComponent : Component
{
public override void Operation() => Console.WriteLine("ConcreteComponent Operation");
}
public abstract class Decorator : Component
{
protected Component _component;
public Decorator(Component component) => _component = component;
public override void Operation() => _component.Operation();
}
public class ConcreteDecoratorA : Decorator
{
public ConcreteDecoratorA(Component component) : base(component) { }
public override void Operation()
{
base.Operation();
Console.WriteLine("ConcreteDecoratorA Operation");
}
}
2.5 外观模式 (Facade)
定义 : 提供一个统一的接口,用来访问子系统中的一群接口。
应用场景: 简化复杂系统的使用。
cs
public class SubsystemA
{
public void OperationA() => Console.WriteLine("SubsystemA Operation");
}
public class SubsystemB
{
public void OperationB() => Console.WriteLine("SubsystemB Operation");
}
public class Facade
{
private SubsystemA _subsystemA = new SubsystemA();
private SubsystemB _subsystemB = new SubsystemB();
public void Operation()
{
_subsystemA.OperationA();
_subsystemB.OperationB();
}
}
2.6 享元模式 (Flyweight)
定义 : 通过共享技术有效地支持大量细粒度的对象。
应用场景: 文本编辑器中的字符对象。
cs
public class Flyweight
{
private string _intrinsicState;
public Flyweight(string intrinsicState) => _intrinsicState = intrinsicState;
public void Operation(string extrinsicState) => Console.WriteLine($"Intrinsic: {_intrinsicState}, Extrinsic: {extrinsicState}");
}
public class FlyweightFactory
{
private Dictionary<string, Flyweight> _flyweights = new Dictionary<string, Flyweight>();
public Flyweight GetFlyweight(string key)
{
if (!_flyweights.ContainsKey(key))
{
_flyweights[key] = new Flyweight(key);
}
return _flyweights[key];
}
}
2.7 代理模式 (Proxy)
定义 : 为其他对象提供一个代理以控制对这个对象的访问。
应用场景: 远程代理、虚拟代理、保护代理。
cs
public interface ISubject
{
void Request();
}
public class RealSubject : ISubject
{
public void Request() => Console.WriteLine("RealSubject Request");
}
public class Proxy : ISubject
{
private RealSubject _realSubject;
public void Request()
{
if (_realSubject == null)
{
_realSubject = new RealSubject();
}
_realSubject.Request();
}
}