8,装饰器模式

(八)装饰器模式

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

1,装饰器模式设计原则

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

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

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

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

image-20210213232717927

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

3,装饰器模式的点评

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值