(八)装饰器模式
装饰器模式(Deorator)指在不改变原有对象的基础上,动态的给一个对象添加功能。它是通过关联机制,即在一个类中嵌入另一个类的对象的引用。与继承的方式实现功能扩展相比更加灵活。
1,装饰器模式设计原则
1,抽象组件(Component):接口或抽象类,用于定义被装饰对象的行为。
2,具体组件(ConcreateComponent):实现或基础抽象组件的一个具体组件,即被装饰对象。
3,抽象装饰器(Decorator):即具体装饰器的通用抽象,其内部有一个属性指向Component。
4,具体装饰器(ConcreateDecorator):Decorator的具体实现。
![image-20210213232717927](https://cdn.jsdelivr.net/gh/hellolsk/imageSource//imageblog/20210213232806.png)
2,简单案例
比如汉堡店,有一个提供主食的服务,其中一个主要服务为汉堡。现在通过构造抽象汉堡装饰器,能够在提供汉堡的基础上实现提供牛奶,可乐等服务,动态的添加服务产品。
public abstract class Component {
protected abstract String getMessage();
protected abstract int getPrice();
}
public class Hamburger extends Component {
protected String getMessage(){
return "汉堡";
}
public int getPrice(){
return 3;
}
}
public abstract class HamburgerDecorator extends Component {
private Component component;
public HamburgerDecorator(Component component){
this.component = component;
}
@Override
protected String getMessage() {
return this.component.getMessage();
}
@Override
public int getPrice() {
return this.component.getPrice();
}
}
public class ColaDecorator extends HamburgerDecorator {
public ColaDecorator(Component component){
super(component);
}
// 装饰器可以实现自己功能
protected void dosomething(){}
@Override
protected String getMessage() {
return super.getMessage()+"colo";
}
@Override
public int getPrice() {
return super.getPrice()+2;
}
}
public class MilkDecorator extends HamburgerDecorator {
public MilkDecorator(Component component) {
super(component);
}
@Override
protected String getMessage() {
return super.getMessage()+"牛奶";
}
@Override
public int getPrice() {
return super.getPrice()+2;
}
}
public class Client {
public static void main(String[] args) {
Component component;
// 套餐基本服务是有一个汉堡
component = new Hamburger();
// 现在想在汉堡的基础上继续买一杯可乐
component = new ColaDecorator(component);
// 再买一杯牛奶,返回的始终是汉堡对象
component = new MilkDecorator(component);
System.out.println(component.getMessage()+",总价:"+component.getPrice());
}
}
![image-20210213234537365](https://cdn.jsdelivr.net/gh/hellolsk/imageSource//imageblog/20210213234539.png)
3,装饰器模式的点评
装饰器模式能够动态的实现功能的修改,他本质是通过抽象装饰器,而装饰器内维护了一个顶级对象的引用。这样,通过关联而减少了继承的依赖性,同样实现了功能的扩展。但是功能组件的过于复杂,会增加程序的复杂性。
与代理模式相比,代理模式更偏向于对象保护和增强,统一的事情让统一的人去做。而装饰器模式更强调自身功能的扩展。