装饰模式是设计模式中结构型模式的一种
装饰模式就是使用被装饰类的一个子类的实例
在客户端将这个子类实例交给装饰类,是继承的替代方案

优点与缺点

优点 :
    使用装饰模式,可以提供比继承更灵活的扩展对象的功能
    它可以动态的添加对象的功能,并可以随意的组合这些功能
缺点 :
    正因为可以随意组合,所以就可能出现一些不合理的逻辑

简单的案例

装饰模式和继承体系有很大的相似之处
但是它比继承要更灵活(进一步提高代码复用性)
以手机功能的扩展为例
具体实现如下 :
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 phone = new IPhone();
phone.call();
//分别使用彩铃Phone与音乐Phone
Phone singPhone = new SingPhoneDecorate(phone);
singPhone.call();
System.out.println("----------");
Phone musicPhone = new MusicPhoneDecorate(phone);
musicPhone.call();
System.out.println("----------");
//如果单独使用与继承区别并不大
//如果两者功能都要使用,使用继承需要再写一个类
//而使用装饰模式只需要创建具有音乐功能的彩铃手机或者反之即可
//Phone newPhone = new SingPhoneDecorate(new MusicPhoneDecorate(phone));
Phone newPhone = new MusicPhoneDecorate(new SingPhoneDecorate(phone));
newPhone.call();
}
对应的执行结果如下 :