装饰模式各个角色
1.抽象构件(Component)角色:给出一个抽象接口,以规范准备接受附加责任的对象。
2.具体构件(Concrete Component)角色:定义一个将要接收附加责任的类。
3.装饰(Decorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。
4.具体装饰(Concrete Decorator)角色:负责给构件对象“贴上”附加的责任。
装饰模式定义
(1)装饰对象和真实对象有相同的接口。这样客户端对象就可以以和真实对象相同的方式和装饰对象交互。
(2)装饰对象包含一个真实对象的引用。
(3)装饰对象接受所有来自客户端的请求,并把这些请求转发给真实的对象。
(4)装饰对象可以在转发这些请求以前或以后增加一些附加功能。
使用场合:
(1)当我们需要为某个现有的对象动态地增加一个新的功能或职责时,可以考虑使用装饰者模式;
(2)当某个对象的职责经常发生变化或者经常需要动态地增加职责,避免为了适应这样的变化而增加继承子类扩展的方式,
因为这种方式会造成子类膨胀的速度过快,难以控制,此时可以使用装饰者模式。
public abstract class Girl {
String description = "no particular";
public String getDescription(){
return description;
}
}
public class AmericanGirl extends Girl {
public AmericanGirl() {
description = "+American";
}
}
public class EuropeanGirl extends Girl {
public EuropeanGirl(){
description = "+European";
}
}
public abstract class GirlDecorator extends Girl {
public abstract String getDescription();
}
public class Science extends GirlDecorator {
private Girl girl;
public Science(Girl girl){
this.girl = girl;
}
@Override
public String getDescription() {
return this.girl.getDescription() + "+Like Science";
}
public void caltulateStuff() {
System.out.println("scientific calculation!");
}
}
public class Art extends GirlDecorator {
private Girl girl;
public Art(Girl girl){
this.girl = girl;
}
@Override
public String getDescription() {
return this.girl.getDescription() + "+Like Art";
}
public void draw() {
System.out.println("draw pictures!");
}
}
public class Main {
public static void main(String[] args) {
//普通美国女孩
Girl g1 = new AmericanGirl();
System.out.println(g1.getDescription());
//喜欢科学的
Science g2 = new Science(g1);
System.out.println(g2.getDescription());
//喜欢艺术的
Art g3 = new Art(g2);
System.out.println(g3.getDescription());
}
}
举例2:装饰模式在Java IO 中的应用
代码:
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));