装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例。
打个比方:一个理发师不会做饭,一个厨子会做饭,他们都实现一个叫做Person的接口,一个理发师想做饭的话,必须持有一个厨子!
共同的接口Person
public interface Person {
public void cook();
}
有做饭能力的厨子类
public class Cook implements Person {
@Override
public void cook() {
System.out.println("做饭去了");
}
}
本来不会做饭的理发师类,但是可以通过持有一个会做饭的累的对象实现自己的做饭能力
public class Barber implements Person {
private Person mPerson;
public Barber(Person mPerson){
super();
this.mPerson = mPerson;
}
@Override
public void cook() {
System.out.println("before decorator!");
mPerson.cook();
System.out.println("after decorator!");
}
}
测试类:
public class DecoratorTest {
public static void main(String[] args){
Person person = new Cook();
Person obj = new Barber(person);
obj.cook();
}
}
打印结果
before decorator!
做饭去了
after decorator!
结论:本来不会做饭的理发师通过持有一个厨子的对象,也会做饭了!厨子装饰了理发师的做饭功能!
恭喜理发师!