8,装饰器模式

(八)装饰器模式

装饰器模式(Deorator)指在不改变原有对象的基础上,动态的给一个对象添加功能。它是通过关联机制,即在一个类中嵌入另一个类的对象的引用。与继承的方式实现功能扩展相比更加灵活。

1,装饰器模式设计原则

1,抽象组件(Component):接口或抽象类,用于定义被装饰对象的行为。

2,具体组件(ConcreateComponent):实现或基础抽象组件的一个具体组件,即被装饰对象。

3,抽象装饰器(Decorator):即具体装饰器的通用抽象,其内部有一个属性指向Component。

4,具体装饰器(ConcreateDecorator):Decorator的具体实现。

8,装饰器模式_第1张图片

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());
    }
}
8,装饰器模式_第2张图片

3,装饰器模式的点评

装饰器模式能够动态的实现功能的修改,他本质是通过抽象装饰器,而装饰器内维护了一个顶级对象的引用。这样,通过关联而减少了继承的依赖性,同样实现了功能的扩展。但是功能组件的过于复杂,会增加程序的复杂性。

与代理模式相比,代理模式更偏向于对象保护和增强,统一的事情让统一的人去做。而装饰器模式更强调自身功能的扩展。

你可能感兴趣的:(设计模式学习,设计模式)