装饰模式是设计模式中结构型模式的一种
装饰模式就是使用被装饰类的一个子类的实例
在客户端将这个子类实例交给装饰类,是继承的替代方案
优点与缺点
优点 :
使用装饰模式,可以提供比继承更灵活的扩展对象的功能
它可以动态的添加对象的功能,并可以随意的组合这些功能
缺点 :
正因为可以随意组合,所以就可能出现一些不合理的逻辑
简单的案例
装饰模式和继承体系有很大的相似之处
但是它比继承要更灵活(进一步提高代码复用性)
以手机功能的扩展为例
具体实现如下 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| 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 phone; public PhoneDecorate(Phone phone) { this.phone = phone; } @Override public void call() { phone.call(); } } public class SingPhoneDecorate extends PhoneDecorate { public SingPhoneDecorate(Phone phone) { super(phone); } @Override public void call() { System.out.println("听彩铃"); super.call(); } } public class MusicPhoneDecorate extends PhoneDecorate{
public MusicPhoneDecorate(Phone phone) { super(phone); }
@Override public void call() { super.call(); System.out.println("听音乐"); } }
public static void main(String[] args) { Phone phone = new IPhone(); phone.call(); Phone singPhone = new SingPhoneDecorate(phone); singPhone.call(); System.out.println("----------"); Phone musicPhone = new MusicPhoneDecorate(phone); musicPhone.call(); System.out.println("----------"); Phone newPhone = new MusicPhoneDecorate(new SingPhoneDecorate(phone)); newPhone.call(); }
|
对应的执行结果如下 :
