简介
在实现一个类的方法时,额外的增加一些功能
这类看似和代理模式的工程相同,在最后会讲解两者的差异
主要模块
- 抽象构件
- 具体构件
- 抽象装饰
- 具体装饰
例子
抽象构件
//吃饭
public interface EatAble {
//吃这个方法
void eat();
}
具体构件
//家里吃饭
public class House implements EatAble {
@Override
public void eat() {
System.out.println("吃饭。。。。");
}
}
抽象装饰
//抽象装饰角色
public class Decorator implements EatAble {
private EatAble eatAble;
public Decorator(EatAble eatAble) {
this.eatAble = eatAble;
}
@Override
public void eat() {
eatAble.eat();
}
}
具体装饰
//具体装饰角色
public class Outer extends Decorator {
public Outer(EatAble eatAble) {
super(eatAble);
}
@Override
public void eat() {
super.eat();
pay();
}
//吃晚饭需要付钱
private void pay() {
System.out.println("付钱。。。。。");
}
}
测试
public class Main {
public static void main(String[] args) {
EatAble house = new House();
house.eat();
System.out.println("===========================");
EatAble outer = new Outer(new House());
outer.eat();
// 吃饭。。。。
//===========================
// 吃饭。。。。
// 付钱。。。。。
}
}
与代理模式的差异
①关注点不一样,代理模式关注的是访问权限,装饰模式关注的增加功能
②调用者能感知到实现装饰模式的类,代理模式感知不到,换言之代理模式不知道 究竟是哪个类完成的代理,而装饰模式需要把这个类传进去
③执行时,代理模式使用的是组合(将原对象作为属性保存起来,执行原对象方法,再执行代理对象额外的方法),装饰模式使用的是集成(首先调用super的原对象方法,在调用装饰对象的额外方法)
④装饰模式层次更加分明,可以为不能进行集成的类形成一条集成链,使用多态