4_装饰模式

装饰模式

正常的添加功能

如果一个人想要穿衣服,那么代码可以这样

image.png

如果客户端想要调用直接使用person方法就可以,但是这违背了开放-封闭原则

我们可以把穿着分开作为一个类

image.png

但是我们需要的是经过组装的人而不是空的人同时每个装饰需要调用自己的方式实现装饰,也就是说可以通过衣服来装饰人以此来达到灵活搭配的效果!!!!

因此我们引入装饰模式

装饰模式

  • 动态地给一个对象添加一些额外的装饰,就添加功能来说修饰模式比生成子类灵活

image.png

componet定义一个对象的接口,可以给这些对象动态的添加职责

concreteComponent是具体的对象可以添加一些职责

Decorator,装饰抽象类,继承了Componet,从外类来扩展Componet的功能,但是对于Componet来说不知道Decorator存在

ConcreteDecoratorB具体的转世对象,用来添加具体的职责

public abstract class Component {
    public abstract void Operation();
}

public abstract class Dector extends Component{
    protected Component component;
    public void SetComponet(Component component){
        this.component = component;
    }

    @Override
    public void Operation() {
        if(component!=null){
            component.Operation();//重写component但是还是执行Componet的Operation
        }
    }
}

public class ConcreteDecoratorA extends Dector{
    private String add;

    @Override
    public void Operation() {
        super.Operation();//先执行父类的operation
        System.out.print(add);//再执行自己独有的
    }
}
public class ConcreteDecorator extends Dector{
    private String add="A";

    @Override
    public void Operation() {
        super.Operation();//先执行父类的operation
        System.out.print(add);//再执行自己独有的
    }
}
public class main {
    public static void main(String[] args) {
        ConcreteComponet c = new ConcreteComponet();
        ConcreteDecorator d1 = new ConcreteDecorator();
        ConcreteDecorator d2 = new ConcreteDecorator();
        d1.SetComponet(c);
        d2.SetComponet(d1);
        d2.Operation();

    }
}

通过setComponet来层层包装,每一个装饰只关心自己的功能,不需要关系如何被添加到关系链中

如果只有一个concreteComponent类那么就不需要抽象出Componet,Decorator类可以直接继承concreteComponent

因此之前的例子我们可以用一下类来实现

image.png

之后如果要添加新的装扮,只需要重新写一个新的装饰类,然后使用setcomponet来嵌套就可以实现功能的累加

总结

装饰模式可以动态的添加功能,原本主题和方法是分开的,但是装饰类可以动态的按顺序的装载新的特性,可以很好的区分核心职责和装饰功能,同时可以去除重复的装饰逻辑(每个装饰类需要单独的实现自己的功能),但是装饰类需要区分好装饰的顺序!!!!!!

posted @ 2022-01-27 15:26  随便写写啦  阅读(27)  评论(0编辑  收藏  举报