装饰设计
在不改变原来类,也不使用继承的基础上增强类的某个功能!!
- 装饰类和被装饰类必须实现相同的接口 - 在装饰类中必须传入被装饰类的引用 - 在装饰类中对需要扩展的方法进行扩展 - 在装饰类中对不需要扩展的方法调用被装饰类中的同名方法
/** * 装饰类和被装饰类需要实现的接口 */ public interface Star { /** * 唱歌 */ void sing(); /** * 跳舞 */ void dance(); } /** * 原有类,被装饰类,需要实现star接口 */ public class LiuDeHua implements Star{ public void sing(){ System.out.println("啊哈,给我一杯忘情水..."); } public void dance(){ System.out.println("蹦恰恰...蹦恰恰..."); } } /** * 装饰类,也需要实现Star接口 */ public class LiuDeHuaWrapper implements Star { private LiuDeHua ldh; public LiuDeHuaWrapper(LiuDeHua ldh){ this.ldh = ldh; } @Override public void sing() { System.out.println("唱歌前喝口水..."); ldh.sing(); System.out.println("唱歌后吃个糖..."); } @Override public void dance() { ldh.dance(); } } public class TestDemo { public static void main(String[] args) { //1.创建一个被装饰类对象 LiuDeHua ldh = new LiuDeHua(); //2.创建一个装饰类对象 LiuDeHuaWrapper wrapper = new LiuDeHuaWrapper(ldh); //3.调用方法 wrapper.sing(); wrapper.dance(); } }