概述:在不改变一个对象本身功能的基础上给对象增加额外的新行为,是继承的替代方案。
优点:使用装饰模式,可以提供比继承更灵活的扩展对象的功能,它可以动态的添加对象的功能,并且可以随意的组合这些 功能。
缺点:正因为可以随意组合,所以就可能出现一些不合理的逻辑。
就如同手机,刚开始的时候只能打电话,随着时间的推移,他能设置彩铃,发送短信,听音乐。下面用一段代码模拟。
先定义一个基本的手机接口
public interface Phone { public void call(); }
实现这个接口,完成基本的打电话功能
public class IPhone implements Phone { @Override public void call() { System.out.println("手机可以打电话"); } }
现在需要设置彩铃,我们定义个装饰类
public abstract class PhoneDecorate implements Phone { private Phone phone; public PhoneDecorate(Phone phone) { this.phone = phone; } @Override public void call() { this.phone.call(); } }
装饰彩铃
public class RingPhone extends PhoneDecorate { public RingPhone(Phone phone) { super(phone); } @Override public void call() { System.out.println("手机可以听彩铃"); super.call(); } }
还可以添加一些其他功能
public class MusicPhone extends PhoneDecorate { public MusicPhone(Phone phone) { super(phone); } @Override public void call() { super.call(); System.out.println("手机可以听音乐"); } }
public class MessagePhone extends PhoneDecorate { public MessagePhone(Phone phone) { super(phone); } @Override public void call() { super.call(); System.out.println("手机可以发短信"); } }
至此这个手机就装饰好了
比如
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
Scanner sc = new Scanner(System.in);
这些也是用的装饰模式