装饰模式
大家好,我叫小赵,现任职藏剑山庄高级铸剑师,今天抽空跟大家唠唠嗑,希望能赚几个点击,赚几个关注。
我们山庄每天都会出很多货,每把武器打造出来之后,会进行包装,因为大众化的口味总是需要各种各样的点缀,因此负责包装的部门也根据包装装饰品的不同分为不同的小组。
咱们从最简单的开始,就打包就行,不用搞装饰。
类图:
剑:
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(); }
输出:
开始包装...
激光刻字...
装剑穗...
这是一把倚天剑!
这就是使用装饰模式进行的倚天剑包装,倚天剑的制造团队并不需要知道倚天剑的装饰品都有哪些,装饰类和被装饰类都可以独立发展,双方不会耦合。
当需要给一个对象动态的附加功能的时候,比如有一批倚天剑需要激光刻字,有一批倚天剑不需要激光刻字,遇到这种场景,优先考虑装饰模式。