帮你整理了一份设计模式速查手册 (4)

 核心通过继承或依赖:

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 桥接

像路由器桥接一样,将两者解耦,通过一个桥接接口连通。桥接模式用于把抽象部分和实现部分分离解耦,使得两者可以独立变化。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpdydg.html