d
1.定义
装饰模式(Decorator),动态地给一份对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。(摘自《大话设计模式》第6章)
2.代码
大概思路是:1)被装饰的对象
2)确定被装饰的对象,和需要装饰的动作
3)具体装饰
person这个类就是需要被装饰的对象,person需要衣服装饰
/**************************************************************
*<P>简要描述:作为被修饰的对象</P>
******************************************************************/
public class Person {
private String name;
public Person() { }
public Person(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public void show() {
System.out.println(name);
}
}
Finery 有两个地方需要关注:person变量和show()方法。person就是确定的被装饰对象,show()方法就是用来装饰的动作。
/**************************************************************
*<P>简要描述:1.确定被修饰的对象
* 2.定义修饰的动作</P>
******************************************************************/
public class Finery extends Person{
private Person component; //被修饰的对象
public void decorate(Person component) {
this.component = component;
}
/**
* 修饰的动作
*/
public void show(){
if (component != null)
component.show();
}
}
具体装饰过程(注意继承的类都是finery这个类,因为finery类确定了修饰对象和动作也相当于把动作和对象关联起来):
给人穿上上衣
public class Jacket extends Finery{
@Override
public void show(){
super.show();
System.out.println("穿上外套");
}
}
给人穿上裤子
public class Trousers extends Finery{
@Override
public void show() {
super.show();
System.out.println("穿上裤子");
}
}
测试:
public class Test {
public static void main(String[] args) {
Person person = new Person("小明"); //要被修饰的对象
Jacket j = new Jacket(); //修饰的动作,穿上衣
Trousers trousers = new Trousers(); //修饰的动作,穿裤子
j.decorate(person); //修饰过程
trousers.decorate(j);//修饰过程
trousers.show();
}
}