设计模式结构型装饰者模式

编程

一、装饰者模式定义

  • 装饰者模式:动态将新功能附加到对象上。在对象扩展方面,它比继承更有弹性,装饰者模式体现着ocp原则。

二、装饰者模式的特点

装饰着模式可以和稍后的组合模式做一个对比,装饰者模式在子类中的一个对象,而组合模式是一个Collection集合。

三、装饰者模式例子

设计不同种类的饮料,饮料可以添加配料,比如可以添加牛奶,并且支持动态添加新配料。每增加一种配料,该饮料的价格就会增加,要求计算一种饮料的价格。

下图表示在 DarkRoast 饮料上新增新添加 Mocha 配料,之后又添加了 Whip 配料。DarkRoast 被 Mocha 包裹,Mocha 又被 Whip 包裹。它们都继承自相同父类,都有 cost() 方法,外层类的 cost() 方法调用了内层类的 cost() 方法。

package structure.decorator;

public interface Beverage {

double cost();

}

package structure.decorator;

/**

* @ClassName: CondimentDecorator

* @description:

* @author: edison_Kwok

* @Date: create in 2019/12/12 0:33

* @Version: 1.0

*/

public abstract class CondimentDecorator implements Beverage {

protected Beverage beverage;

}

package structure.decorator;

/**

* @ClassName: Milk

* @description:

* @author: edison_Kwok

* @Date: create in 2019/12/12 0:33

* @Version: 1.0

*/

public class Milk extends CondimentDecorator {

public Milk(Beverage beverage) {

this.beverage = beverage;

}

@Override

public double cost() {

return 1 + beverage.cost();

}

}

package structure.decorator;

/**

* @ClassName: Mocha

* @description:

* @author: edison_Kwok

* @Date: create in 2019/12/12 0:34

* @Version: 1.0

*/

public class Mocha extends CondimentDecorator {

public Mocha(Beverage beverage) {

this.beverage = beverage;

}

@Override

public double cost() {

return 1 + beverage.cost();

}

}

package structure.decorator;

/**

* @ClassName: DarkRoast

* @description:

* @author: edison_Kwok

* @Date: create in 2019/12/12 0:32

* @Version: 1.0

*/

public class DarkRoast implements Beverage {

@Override

public double cost() {

return 1;

}

}

package structure.decorator;

/**

* @ClassName: HouseBlend

* @description:

* @author: edison_Kwok

* @Date: create in 2019/12/12 0:32

* @Version: 1.0

*/

public class HouseBlend implements Beverage {

@Override

public double cost() {

return 1;

}

}

这里定义了

  • Component---Beverage类
  • ConcreateComponent---DarkRoast类、HouseBlend类
  • Decorator---Milk类、Mocha类

在使用时:

package structure.decorator;

/**

* @ClassName: Client

* @description:

* @author: edison_Kwok

* @Date: create in 2019/12/12 0:34

* @Version: 1.0

*/

public class Client {

public static void main(String[] args) {

Beverage beverage = new HouseBlend();

beverage = new Mocha(beverage);

beverage = new Milk(beverage);

System.out.println(beverage.cost());

}

}

以上是 设计模式结构型装饰者模式 的全部内容, 来源链接: utcz.com/z/512161.html

回到顶部