设计模式结构型装饰者模式
一、装饰者模式定义
- 装饰者模式:动态将新功能附加到对象上。在对象扩展方面,它比继承更有弹性,装饰者模式体现着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