码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式-装饰者模式

时间:2020-06-02 11:42:00      阅读:47      评论:0      收藏:0      [点我收藏+]

标签:abstract   独立   多层   col   功能   接口   png   ora   tde   

装饰者模式(Decorator)

装饰者模式(Decorator):动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

 

装饰者模式结构:

技术图片

 

 

 

抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。

具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类

装饰角色(Decorator):持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口

具体装饰角色(ConcreteDecorator):负责给构件对象“贴上”附加的责任

 

技术图片

 

 

 

//Component:给出一个抽象接口,以规范准备接收附加责任的对象。
public abstract class Beverage{
    //说明
    public String description = "Unkonwn Beverage";
    //获取说明信息
    public String getDescription(){
        return description;
    }
    //价格
    public abstract BigDecimal cost();
}

 

//ConcreteComponent:定义一个将要接收附加责任的类
public class DarkRoast extends Beverage{
    //初始化名称
    public DarkRoast() {
        description = "深焙咖啡";
    }
    //返回价格
    @Override
    public BigDecimal cost() {
        return new BigDecimal("5.9");
    }
}

  

//Decorator:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口
public abstract class CondimentDecorator extends Beverage{
    //用变量记录被装饰者
    Beverage beverage;
}
//ConcreteDecorator:负责给构件对象“贴上”附加的责任
public class Milk extends CondimentDecorator{
    //记录被装饰着
    public Milk(Beverage beverage) {
        this.beverage = beverage;
    }
    //返回被装饰者与装饰者说明
    @Override
    public String getDescription() {
        return beverage.getDescription() + "+Milk";
    }
    //返回装饰者与被装饰者价格总合
    @Override
    public BigDecimal cost() {
        return beverage.cost().add(new BigDecimal("1"));
    }
}

 

设计原则:

1、类应该对扩展开放,对修改关闭(开闭原则)

2、多用组合,少用继承。

优点:

1、装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

缺点:

1、多层装饰比较复杂。

应用场景:

1、扩展一个类的功能。

2、动态增加功能,动态撤销。

 

实际使用:这里我们说一下,在java中I/O便使用了装饰者模式。

 

 技术图片

 

设计模式-装饰者模式

标签:abstract   独立   多层   col   功能   接口   png   ora   tde   

原文地址:https://www.cnblogs.com/liuchd/p/13029670.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!