概念:
装饰模式就是使用装饰类的一个子类的实例, 在客户端将这个子类的实例交给装饰类. 是继承的替换方案.优点:
使用装饰模式. 可以提供比 继承 更灵活的扩展对象, 它可以动态的添加对象的功能, 并且可以随意的组合这些功能缺点:
正因为可以随意组合, 所以就可能出现一些 不合理的逻辑.示例图
手机模型
public interface Phone { public abstract void call(); } 具体的手机 public class IPhone implements Phone { @Override public void call() { System.out.println("手机可以打电话了"); } } 装饰的抽象类 public abstract class PhoneDecorate implements Phone { private Phone p; public PhoneDecorate(Phone p) { this.p = p; } @Override public void call() { this.p.call(); } } 音乐装饰类 public class MusicePhoneDecorate extends PhoneDecorate { public MusicePhoneDecorate(Phone p) { super(p); } @Override public void call() { super.call(); System.out.println("手机可以听音乐了"); } } 彩铃装饰类 public class RingPhoneDecorate extends PhoneDecorate { public RingPhoneDecorate(Phone p) { super(p); } @Override public void call() { System.out.println("手机可以听彩铃!"); super.call(); } } 测试类 import java.io.*; import java.util.Scanner; public class PhoneDemo { public static void main(String[] args) { Phone p = new IPhone(); p.call(); System.out.println("------------"); // 需求:我想在接电话前接彩铃 PhoneDecorate pd = new RingPhoneDecorate(p); pd.call(); System.out.println("------------"); // 需求:我想在接电话后听音乐 pd = new MusicePhoneDecorate(p); pd.call(); System.out.println("------------"); // 需求:我要想手机在接前听彩铃,接后听电话 // 自己提供装饰类,再打电话前听彩铃,打电话后听音乐 pd = new RingPhoneDecorate(new MusicePhoneDecorate(p)); pd.call(); System.out.println("------------"); // 想想我们在IO流中的使用 /* InputStream is = System.in; // 字节流 InputStreamReader isr = new InputStreamReader(is); // 字符流 每次只能读取一个 BufferedReader br = new BufferedReader(isr); // 高效系列 */ // 装饰二次 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 装饰一次 Scanner sc = new Scanner(System.in); } } /* 在java9.0.4输出结果是: 手机可以打电话了 ------------ 手机可以听彩铃! 手机可以打电话了 ------------ 手机可以打电话了 手机可以听音乐了 ------------ 手机可以听彩铃! 手机可以打电话了 手机可以听音乐了 */