装饰模式

  大家好,我叫小赵,现任职藏剑山庄高级铸剑师,今天抽空跟大家唠唠嗑,希望能赚几个点击,赚几个关注。

  我们山庄每天都会出很多货,每把武器打造出来之后,会进行包装,因为大众化的口味总是需要各种各样的点缀,因此负责包装的部门也根据包装装饰品的不同分为不同的小组。

  咱们从最简单的开始,就打包就行,不用搞装饰。

类图:

剑:

public abstract class Sword {
    //打包
    public abstract void pack();
    //展示
    public abstract void show();
}

倚天剑:

public class YitianSword extends Sword {
    @Override
    public void pack() {
        System.out.println("开始包装...");
    }

    @Override
    public void show() {
        System.out.println("这是一把倚天剑!");
    }
}

主函数:

    public static void main(String[] args){
        Sword yitian = new YitianSword();
        yitian.pack();
        yitian.show();
    }

输出:

开始包装...
这是一把倚天剑!

  接下来我们就要对倚天剑进行各式各样装饰,给倚天剑加个剑穗,再加个激光刻字,其实加什么都是小事,重要的是,要遵守开闭原则,对修改关闭,对扩展开放,在不修改原来代码的前提下完成新功能的增加,做到真正的拥抱变化。

类图:

装饰器抽象:

public abstract class Decorator extends Sword {
    //要装饰的目标
    private Sword sword;

    public Decorator(Sword sword) {
        this.sword = sword;
    }

    @Override
    public void pack() {
        this.sword.pack();
    }

    @Override
    public void show() {
        this.sword.show();
    }
}

装饰剑穗:

public class EarDecorator extends Decorator {
    public EarDecorator(Sword sword) {
        super(sword);
    }

    private void ear(){
        System.out.println("装剑穗...");
    }

    @Override
    public void pack() {
        super.pack();
        this.ear();
    }
}

装饰激光刻字:

public class LetteringDecorator extends Decorator {
    public LetteringDecorator(Sword sword) {
        super(sword);
    }

    private void sheath(){
        System.out.println("激光刻字...");
    }

    @Override
    public void pack() {
        super.pack();
        this.sheath();
    }
}

主函数:

    public static void main(String[] args) {
        Sword yitianSword = new YitianSword();
        yitianSword = new LetteringDecorator(yitianSword);//装饰激光刻字
        yitianSword = new EarDecorator(yitianSword);//装饰剑穗
        yitianSword.pack();//开始装饰
        yitianSword.show();
    }

输出:

开始包装...
激光刻字...
装剑穗...
这是一把倚天剑!

  这就是使用装饰模式进行的倚天剑包装,倚天剑的制造团队并不需要知道倚天剑的装饰品都有哪些,装饰类和被装饰类都可以独立发展,双方不会耦合。

  当需要给一个对象动态的附加功能的时候,比如有一批倚天剑需要激光刻字,有一批倚天剑不需要激光刻字,遇到这种场景,优先考虑装饰模式。

原文地址:https://www.cnblogs.com/fengyumeng/p/10767153.html