装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构,这种模式的实现有两种
实现1、通过继承原有的类,在保证父类原有功能的基础上,提供额外的功能
实现2、创建一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
场景:将旧手机换新
实现1:定义旧手机以旧翻新接口
/** * 旧手机抽象 * @author test11 */ public abstract class OldPhone { /** * 主要装饰的目的:以旧变新 */ public abstract void changeNew(); }
将旧手机更换下外壳,装饰成新手机
/** * 装饰手机 * @author test11 */ public class NewPhone1 extends OldPhone{ public void swapHull(){ System.out.println("换外壳"); } @Override public void changeNew() { this.swapHull(); } }
继承之前更新的基础,换零件+换包装,装饰成新手机
/** * 翻新手机 * @author test11 */ public class NewPhone2 extends NewPhone1 { public void swapMachine(){ System.out.println("换零件"); } public void swapPkg(){ System.out.println("换包装"); } @Override public void changeNew(){ this.swapMachine(); super.swapHull(); this.swapPkg(); } }
将包装后的新手机卖出新价格
/** * 装饰器模式的测试 * @author test11 */ public class Demo { public static void main(String[] args) { OldPhone phone1 = new NewPhone1(); phone1.changeNew(); System.out.println("价格1000"); System.out.println(""); OldPhone phone2 = new NewPhone2(); phone2.changeNew(); System.out.println("价格1500"); } }
实现2:定义旧手机以旧翻新接口
/** * 旧手机对象 * @author test11 */ public abstract class OldPhone { /** * 主要装饰的目的:以旧变新 */ public abstract void changeNew(); }
将旧手机更换下外壳,装饰成新手机
/** * 装饰手机 * @author test11 */ public class NewPhone extends OldPhone { public void swapHull(){ System.out.println("换外壳"); } @Override public void changeNew() { this.swapHull(); } }
创建一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能
/** * @author test11 */ public abstract class Decorator extends OldPhone { OldPhone oldPhone; Decorator(OldPhone oldPhone){ this.oldPhone = oldPhone; } @Override public void changeNew() { this.oldPhone.changeNew(); } }
把换零件和换包装的动作独立出来
/** * 更换零件 * @author test11 */ public class SwapMachine extends Decorator{ SwapMachine(OldPhone oldPhone) { super(oldPhone); } public void swapMachine(){ System.out.println("更换零件"); } @Override public void changeNew() { super.changeNew(); this.swapMachine(); } }
/** * 更换包装 * @author test11 */ public class SwapPkg extends Decorator{ SwapPkg(OldPhone oldPhone) { super(oldPhone); } public void swapPkg(){ System.out.println("更换包装"); } @Override public void changeNew() { super.changeNew(); this.swapPkg(); } }
将包装后的新手机卖出新价格
/** * 测试装饰者模式 * @author test11 */ public class Demo { public static void main(String[] args) { OldPhone oldPhone = null; oldPhone = new NewPhone(); oldPhone = new SwapMachine(oldPhone); oldPhone = new SwapPkg(oldPhone); oldPhone.changeNew(); System.out.println("价格1500"); } }