袁艺

个人站

欢迎来到我的个人站~


装饰者模式

装饰者模式

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

  • 装饰者和被装饰者有相同的超类型
  • 可以用一个或者多个装饰者包装一个对象
  • 在任何需要原始对象(被包装的)的场合,可以用装饰过的对象代替它
  • 装饰者可以在所委托被装饰者的行为之前/之后,加上自己的行为,以达到特定的目的
  • 对象可以在任何时候被装饰,所以可以运行时动态的、不限量地用你喜欢地装饰者来装饰对象

类图

涉及设计原则

开闭原则:类应该对扩展开放,对修改关闭

例子

购买饮料时可以添加不同的配料

饮料店的类图

原始代码:Beverge类是店铺原始的设计抽象类

public abstract class Beverage {
    public String getDesectrption() {
        return desectrption;
    }

    String desectrption = "Beverage";

    public abstract double cost();
}

Condiment装饰者类

public abstract class CondimentDecorator  extends  Beverage{
    @Override
    public abstract String getDesectrption();
}

下面实现一些饮料类,也就是组件。需要为具体的饮料设置描述,还要实现cost方法

public class Epresso extends Beverage {

    public Epresso() {
       desectrption="Epresso";
    }

    @Override
    public double cost() {
        return 1.99;
    }
}

public class HouseBlend extends Beverage {
    public HouseBlend() {
        desectrption="House and Blend";
    }

    @Override
    public double cost() {
        return .89;
    }
}

实现具体的装饰者,mocha。

public class Mocha extends  CondimentDecorator {
    Beverage beverage;//记录饮料,也就是被装饰者

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

    @Override
    public String getDesectrption() {
        return beverage.getDesectrption()+",Mocha";
    }

    @Override
    public double cost() {
        return beverage.cost()+.20;
    }
}

测试类

    public static void main(String[] args) {
        Beverage beverage=new Epresso();
        System.out.println(beverage.getDesectrption()+"$"+beverage.cost());
        Beverage beverage1=new HouseBlend();
        beverage1=new Mocha(beverage1);
        beverage1=new Mocha(beverage1);
        System.out.println(beverage1.getDesectrption()+"$"+beverage1.cost());
    }

运行结果:

Epresso$1.99

House and Blend,Mocha,Mocha$1.29

Java中的装饰者Java.IO

inputstream的装饰类图