向一个现有的对象添加新的功能,同时又不改变其结构。比如一个人,我们可以给他装饰帽子,衣服等,又不影响本身人的特点。
例子:
public interface Person {
void show();
}
public class Man implements Person{
@Override
public void show() {
System.out.println("Person: Man");
}
}
public class Woman implements Person{
@Override
public void show() {
System.out.println("Person: Woman");
}
}
public abstract class PersonDecorator implements Person{
protected Person decoratedPerson;
public PersonDecorator(Person decoratedPerson){
this.decoratedPerson = decoratedPerson;
}
public void show(){
decoratedPerson.show();
}
}
public class OldPersonDecorator extends PersonDecorator{
public OldPersonDecorator(Person decoratedPerson) {
super(decoratedPerson);
}
@Override
public void show(){
decoratedPerson.show();
setOldProperty(decoratedPerson);
}
private void setOldProperty(Person decoratedPerson) {
System.out.println("Is Old");
}
}
public class Test {
public static void main(String[] args) {
Person man = new Man();
Person oldMan = new OldPersonDecorator(new Man());
Person oldWoman = new OldPersonDecorator(new Woman());
System.out.println("-------man--------");
man.show();
System.out.println("-------old man--------");
oldMan.show();
System.out.println("-------old woman--------");
oldWoman.show();
}
}
输出结果:
System.out: -------man-------- System.out: Person: Man System.out: -------old man-------- System.out: Person: Man System.out: Is Old System.out: -------old woman-------- System.out: Person: Woman System.out: Is Old
装饰模式和代理模式的区别
- 装饰模式是对客户端以透明的方式扩展对象的功能,是继承关系的一种替代;而代理模式则是给一个对象提供一个代理对象,并由代理对象来控制对原有对象的引用
- 装饰模式应该为所装饰的对象增加功能,而代理对象对所代理的对象施加控制,但不对对象本身的功能进行增强