装饰者模式(Decorator Pattern)

本文介绍装饰者模式,一种允许在不改变对象结构的前提下动态扩展其功能的设计模式。通过具体例子展示了如何使用装饰者模式来扩展对象的行为,同时遵循开放—关闭原则。

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


设计原则

  • 类应该对扩展开放,对修改关闭。(开放—关闭原则。)

结构

这里写图片描述

Component
  • 定义一个对象接口,可以给这些对象动态的添加职责。
ConcreteComponent
  • 定义一个对象,可以给这个对象添加一些职责。
Decorator
  • 维持一个指向Component对象的指针,并定义一个与Component接口一致的接口。
ConcreteDecorator
  • 向组件添加职责。

Java I/O

——真实世界的装饰者。

”黑暗面“

  • 在设计中加入大量的小类。
  • 代码会依赖特定的类型。
  • 实例化组件时,会增加代码的复杂度。(工厂模式和生成器模式对这个问题有帮助。)

For example

public abstract class Beverage {
    String description = "Unknown Beverage";

    public String getDescription()
    {
        return description;
    }

    public abstract double cost();
}
public abstract class CondimentDecorator extends Beverage{
    public abstract String getDescription();
}
public class Espresso extends Beverage{
    public Espresso()
    {
        description = "Espresso";
    }

    public double cost()
    {
        return 1.99;
    }

}
public class HouseBlend extends Beverage{
    public HouseBlend()
    {
        description = "HouseBlend";
    }

    public double cost()
    {
        return 0.89;
    }
}
public class Mocha extends CondimentDecorator{
    Beverage beverage;

    public Mocha(Beverage beverage)
    {
        this.beverage = beverage;
    }

    public String getDescription()
    {
        return beverage.getDescription() + ", Mocha";
    }

    public double cost()
    {
        return .2 + beverage.cost();
    }
}
public class StarbuzzCoffee {

    public static void main(String[] args)
    {
        Beverage beverage = new Espresso();
        System.out.println(beverage.getDescription()
                + " $" + beverage.cost());

        Beverage beverage2 = new HouseBlend();
        beverage2 = new Mocha(beverage2);
        beverage2 = new Mocha(beverage2);
        System.out.println(beverage2.getDescription()
                + " $" + beverage2.cost());
    }
}

参考《设计模式》《Head First Design Patterns》

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值