定义:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。层层包装,增强功能。
在装饰模式中的各个角色有:
(1)抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。
(2)具体构件(Concrete Component)角色:定义一个将要接收附加责任的类。
(3)装饰(Decorator)角色:持有一个构件(Component)对象的实例,并实现一个与抽象构件接口一致的接口。
(4)具体装饰(Concrete Decorator)角色:负责给构件对象添加上附加的责任。
“`
public abstract class Girl {
2
String description = “no particular”;
3
4
public String getDescription(){
5
return description;
6
}
7
}
AmericanGirl.java
1
public class AmericanGirl extends Girl {
2
3
public AmericanGirl() {
4
description = “+American”;
5
}
6
7
}
EuropeanGirl.java
1
public class EuropeanGirl extends Girl {
2
3
public EuropeanGirl(){
4
description = “+European”;
5
}
6
7
}
GirlDecorator.java
1
public abstract class GirlDecorator extends Girl {
2
3
public abstract String getDescription();
4
5
}
Science.java
01
public class Science extends GirlDecorator {
02
03
private Girl girl;
04
05
public Science(Girl girl){
06
this.girl = girl;
07
}
08
09
@Override
10
public String getDescription() {
11
return this.girl.getDescription() + “+Like Science”;
12
}
13
14
public void caltulateStuff() {
15
System.out.println(“scientific calculation!”);
16
}
17
}
Art.java
01
public class Art extends GirlDecorator {
02
03
private Girl girl;
04
05
public Art(Girl girl){
06
this.girl = girl;
07
}
08
09
@Override
10
public String getDescription() {
11
return this.girl.getDescription() + “+Like Art”;
12
}
13
14
public void draw() {
15
System.out.println(“draw pictures!”);
16
}
17
}
Main.java
01
public class Main {
02
03
public static void main(String[] args) {
04
//普通美国女孩
05
Girl g1 = new AmericanGirl();
06
System.out.println(g1.getDescription());
07
08
//喜欢科学的
09
Science g2 = new Science(g1);
10
System.out.println(g2.getDescription());
11
12
//喜欢艺术的
13
Art g3 = new Art(g2);
14
System.out.println(g3.getDescription());
15
}
16
17
}
/scienceGirl->artGirl->girl-> new ChinaGirl(); /
“public class DecoratorPattern {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Girl girl = new ChinaGirl();
System.out.println(girl.getDescription()); //China girl的getDescription
GirlDecoator artGirl = new Art(girl);
System.out.println(artGirl.getDescription());
GirlDecoator scienceGirl = new Science(artGirl);
System.out.println(scienceGirl.getDescription());
/*scienceGirl->artGirl->girl-> new ChinaGirl(); */
}
}