设计模式之装饰着模式
装饰者模式其实就是为了增强类,增强类的要素
a.增强类必须实现被增强类的接口
b.增强类中必须含有被增强类的应用
创建一个手机接口(Phone)
/* * 创建一个手机接口 */ public interface Phone { public abstract void call(); }
创建手机的实现类(HuaWeiPhone)
/* * 手机的实现类 */ public class HuaWeiPhone implements Phone{ @Override public void call() { System.out.println("打电话中......"); } }
创建增强手机的实现类(在打电话之前需要响铃)
/** * 1.增强类必须和被增强类实现同一接口 * 实现Phone接口 * 2.增强类中必须引用被增强类的对象 * 引用HuaWeiPhone */ public class HuaWeiDecorate implements Phone{ private Phone HuaWeiPhone; public HuaWeiDecorate(Phone HuaWeiPhone) { this.HuaWeiPhone=HuaWeiPhone; } @Override public void call() { System.out.println("电话铃响了...."); HuaWeiPhone.call(); } }
测试方法:
public static void main(String[] args) { HuaWeiPhone hwp=new HuaWeiPhone(); HuaWeiDecorate hd=new HuaWeiDecorate(hwp); hd.call(); }
在打完电话后想听音乐
public class HuaWeiDecorate1 implements Phone{ private Phone HuaWeiPhone; public HuaWeiDecorate1(Phone HuaWeiPhone) { this.HuaWeiPhone=HuaWeiPhone; } @Override public void call() { HuaWeiPhone.call(); System.out.println("音乐响了...."); } }
测试方法:
public static void main(String[] args) { HuaWeiPhone hwp=new HuaWeiPhone(); HuaWeiDecorate hd=new HuaWeiDecorate(hwp); HuaWeiDecorate1 hd1=new HuaWeiDecorate1(hwp); hd.call(); hd1.call(); }
这样我们就需要对于这个装饰类进行抽取出来,若果有多个装饰类这样我们就需要进行抽取
/* * 手机的实现类 */ public class HuaWeiPhone implements Phone{ @Override public void call() { System.out.println("手机可以打电话 !"); } }
public class HuaWeiDecorate extends DecorateClass{ public HuaWeiDecorate(Phone p) { super(p); } @Override public void call() { System.out.println("电话铃响了...."); super.call(); } }
public class HuaWeiDecorate1 extends DecorateClass{ public HuaWeiDecorate1(Phone p) { super(p); } @Override public void call() { super.call(); System.out.println("音乐响了"); } }
public class DecorateClass implements Phone{ private Phone p; public DecorateClass(Phone p) { this.p=p; } @Override public void call() { this.p.call(); } }
测试类:
public static void main(String[] args) { HuaWeiPhone hwp=new HuaWeiPhone(); Phone hd=new HuaWeiDecorate(hwp); Phone h=new HuaWeiDecorate1(hd); h.call(); }