设计模式-装饰器模式

878 阅读2分钟

装饰器模式

引言

在玩LOL的时候,我们会对喜欢的英雄购买相应的皮肤,每种皮肤都有不同的效果。

正文

装饰器模式是指在不改变现有对象结构的情况下,可以动态的对当前对象增加新的职责,它属于对象结构型模式。

核心思想

装饰器模式通过拓展的方式来修改对象,比继承更灵活; 对同一个对象可以添加多个装饰类,可以进行多种组合。

代码实现

讲解

//抽象构件接口
public interface Component {
    void operation();
}
//具体构件
public class ConcreteComponent implements Component {

    public ConcreteComponent() {
        System.out.println("具体的构建");
    }

    @Override
    public void operation() {
        System.out.println("调用具体构建的operation()");
    }
}
//抽象装饰器
public abstract class Decorator implements Component {
    private Component component;

    public Decorator(Component component) {
        this.component = component;
    }

    @Override
    public void operation() {
        component.operation();
    }
}
//具体装饰器
public class ConcreteDecorator extends Decorator {
    public ConcreteDecorator(Component component) {
        super(component);
    }

    @Override
    public void operation() {
        super.operation();
        addFunction();
    }

    private void addFunction() {
        System.out.println("为具体构件添加额外的功能");
    }
}

实例

public interface Champion {
    void display();
}
public class Jhin implements Champion {
    @Override
    public void display() {
        System.out.println("我是戏命师-烬");
    }
}
public abstract class SkinDecorator implements Champion {

    private Champion champion;

    public SkinDecorator(Champion champion) {
        this.champion = champion;
    }

    @Override
    public void display() {
        champion.display();
    }
}
public class JhinSkinDecorator extends SkinDecorator {
    public JhinSkinDecorator(Champion champion) {
        super(champion);
    }

    @Override
    public void display() {
        super.display();
        skinEffect();
    }

    private void skinEffect() {
        System.out.println("烬皮肤特效:更炫酷");
    }

}
public class JhinSkinDecorator2 extends SkinDecorator {
    public JhinSkinDecorator2(Champion champion) {
        super(champion);
    }

    @Override
    public void display() {
        super.display();
        skinEffect();
    }

    private void skinEffect() {
        System.out.println("烬皮肤特效:更拉风");
    }
}
public class Main {
    public static void main(String[] args) {
        Champion jhin = new Jhin();
        SkinDecorator jhinSkinDecorator1 = new JhinSkinDecorator(jhin);
        jhinSkinDecorator1.display();
        SkinDecorator jhinSkinDecorator2 = new JhinSkinDecorator2(jhin);
        jhinSkinDecorator2.display();
    }
}

输出结果

我是戏命师-烬
烬皮肤特效:更炫酷
我是戏命师-烬
烬皮肤特效:更拉风

总结

装饰器模式适用于那些可以对现有功能进行动态的增加和删除的模块。也可以用于将那些需要对基础功能进行组合,此时采用继承难以实现,而使用装饰器则相对容易实现。