注意:虽然代理模式和装饰器模式在代码实现上一模一样,但是含义不一样。代理模式侧重访问控制功能(中介),如通过中介买房子,中介和房子属于不同种类。装饰模式侧重增强装饰对象的功能,如之前的是毛坯房,装饰之后是精装房,毛坯房和精装房属于相同种类
定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些额外功能的模式,它属于对象结构型模式
优点:
缺点:
适用场景:
继承具有静态特征,耦合度高,随着扩展功能的增多,子类会很膨胀。如果使用组合关系来创建一个装饰对象来包裹真实对象,并在保持真实对象的类结构不变的前提下,为其提供额外的功能
结构:
实现:
public class DecoratorTest {
public static void main(String[] args) {
House roughCastHouse = new RoughCastHouse();
roughCastHouse.buyHouse();
System.out.println("==========================");
House hardCoverHouse = new HardCoverHouse(roughCastHouse);
hardCoverHouse.buyHouse();
}
}
// 抽象构建角色:房子模型
interface House {
void buyHouse();
}
// 具体构建角色:毛胚房
class RoughCastHouse implements House {
public void buyHouse() {
System.out.println("这是您买的一套毛坯江景房");
}
}
// 抽象装饰角色: 装修房子
class DecoratorHouse implements House {
private House house;
public DecoratorHouse(House house) {
this.house = house;
}
public void buyHouse() {
this.house.buyHouse();
}
}
// 具体装饰角色:装修出来的精装房
class HardCoverHouse extends DecoratorHouse {
public HardCoverHouse(House house) {
super(house);
}
public void buyHouse() {
super.buyHouse();
decoratorHouse();
}
// 对房子进行装修
public void decoratorHouse() {
System.out.println("这是装修出来的精装江景房");
}
}
运行程序,结果如下:
这是您买的一套毛坯江景房
==========================
这是您买的一套毛坯江景房
这是装修出来的精装江景房