核心通过继承或依赖:
class Adapter : Target{
private Adaptee adaptee = new Adaptee();
public override void Request()
{
adaptee.SpecificRequest();
}
}
主要解决现有类不能满足系统接口要求下,将现有类(可以是多个)包装到接口继承类下。这样接口继承类就能调用接口来实际调用现有类功能。虽然提高类的复用,增加灵活,但过多使用导致内部太透明,明明调用的是A接口,后台又实际调用的B接口。所以可以看出适配器是在项目服役时期做的灵活调整,属于临阵磨枪,设计期能重构不用最好。不便重构的情况下,适配器可以快速统一接口。
2、Decorator 装饰人靠衣服马靠鞍,装饰模式就像给人搭配服饰,可以根据不同场合搭配不同的风格,装饰模式可以动态的给一个对象添加额外的功能职责(比直接用子类灵活一些),在不增加子类的情况下扩展类。
核心套路:Component 类充当抽象角色,不具体实现,ConcreteComponent子类代表实际的对象,现在要给这个对象添加一些新的功能。装饰类继承并且引用Component类,通过设置装饰类中的Component属性调用具体被装饰对象ConcreateComponent方法。可能有些绕,关键在于装饰类和具体被装饰对象都要继承相同的抽象Component 类。
看下代码也许会更容易理解
abstract class Component{
public abstract void Operation();
}
class ConcreteComponent : Component
{
public override void Operation()
{
Console.WriteLine("具体被装饰对象的操作 ")
}
}
abstract class Decorator : Component
{
protected Component component;
public void SetComponent(Component component)
{
this.component = component;
}
public override void Operation()
{
if (component != null)
{
component.Operation();
}
}
}
class ConcreateDecoratorA : Decorator
{
private string addedState;
public override void Operation()
{
base.Operation();//执行原Component的功能
//可以添加需要装饰的东西,增加什么功能
addedState = "New State";
Console.WriteLine("具体装饰对象A的操作 ");
}
}
class ConcreateDecoratorB : Decorator
{
public override void Operation()
{
base.Operation();//执行原Component的功能
//可以添加需要装饰的东西,增加什么功能
AddedBehavior();
Console.WriteLine("具体装饰对象B的操作 ");
}
private void AddedBehavior()
{
}
}
客户端调用时像下面这样。
ConcreteComponent c = new ConcreteComponent();ConcreateDecoratorA d1 = new ConcreateDecoratorA();
ConcreateDecoratorB d2 = new ConcreateDecoratorB();
d1.SetComponent(c);
d2.SetComponent(d1);
d2.Operation();
利用SetComponent将待装饰对象包装到装饰器中,然后调用装饰器的同名方法(因为都继承相同的抽象类)。像上面这样可以定义不同的装饰器,会按顺序逐个调用装饰的部分。
总之,装饰模式可以动态扩展一个实现类的功能,当有实现类需要增加特殊行为时,可以用一个单独的装饰类去实现,(把被装饰类也就是实现类包装进去即可),像前面的也可以不用一个Component抽象类,直接用装饰类继承被装饰类就不需要修改原类。有一个不好的地方就是如果装饰行为多了,请注意装饰顺序。
3、Bridge 桥接像路由器桥接一样,将两者解耦,通过一个桥接接口连通。桥接模式用于把抽象部分和实现部分分离解耦,使得两者可以独立变化。