设计模式-装饰者模式

Posted liuchd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式-装饰者模式相关的知识,希望对你有一定的参考价值。

装饰者模式(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便使用了装饰者模式。

 

 技术图片

 

以上是关于设计模式-装饰者模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式-装饰者模式(Go语言描述)

设计模式-装饰者模式(Go语言描述)

设计模式整理_装饰者模式

设计模式 之 装饰者模式

装饰者模式

设计模式之装饰者模式