装饰器模式
什么是装饰器模式:
是一种结构型设计模型,允许在不改变对象结构的情况下,动态的将新的功能添加到对象上,
核心思想:
通过组合而非继承的方式来实现功能的扩展。他可以在运行时动态的添加活移除对象的功能,而无需修改原始对象的代码。
解决的问题:
继承关系过于复杂的问题,通过组合来代替继承。
使用场景:
用于扩展一个类的功能,或者给一个类添加附加职责
动态的给一个对象添加功能,这些功能可以动态的被撤销
需要为一批平行的兄弟类进行改造或者加装功能
案例:为咖啡添加作料
咖啡接口
package Decorator;/*** 抽象咖啡类*/
public interface Coffee {double getCost();String getDescription();
}
装饰器抽象类
package Decorator;/*** 装饰器抽象类*/
public abstract class CoffeeDecorator implements Coffee {//静态代理/*** 静态代理:* 创建目标 创建代理对象 将目标传给代理对象*/protected final Coffee decoratorCoffee;public CoffeeDecorator(Coffee decoratorCoffee) {this.decoratorCoffee = decoratorCoffee;}@Overridepublic double getCost() {return decoratorCoffee.getCost();}@Overridepublic String getDescription() {return decoratorCoffee.getDescription();}
}
普通咖啡类:
package Decorator;/*** 基础咖啡类*/
public class SimpleCoffee implements Coffee{@Overridepublic double getCost() {return 1.0;}@Overridepublic String getDescription() {return "Simple coffee";}
}
牛奶装饰器类
package Decorator;/*** 牛奶装饰器*/
public class MilkDecorator extends CoffeeDecorator {public MilkDecorator(Coffee decoratorCoffee) {super(decoratorCoffee);}@Overridepublic double getCost() {return super.getCost() + 0.5;}@Overridepublic String getDescription() {return super.getDescription() + "with milk";}}
糖浆装饰器类
package Decorator;/*** 糖浆装饰器*/
public class SyrupDecorator extends CoffeeDecorator{public SyrupDecorator(Coffee decoratorCoffee) {super(decoratorCoffee);}@Overridepublic double getCost() {return super.getCost() + 1;}@Overridepublic String getDescription() {return super.getDescription() + "with 糖浆";}}
测试类:
package Decorator;public class Client {public static void main(String[] args) {//基本咖啡Coffee simpleCoffee = new SimpleCoffee();System.out.println("simpleCoffee" + simpleCoffee.getDescription() + ",cost:" + simpleCoffee.getCost());//咖啡 + 牛奶Coffee milkCoffee = new MilkDecorator(simpleCoffee);System.out.println("milkCoffee:" + milkCoffee.getDescription() + ",cost:" + milkCoffee.getCost());//咖啡 + 牛奶 + 糖Coffee syrupCoffee = new SyrupDecorator(milkCoffee);System.out.println("syrupCoffee + milkCoffee:" + syrupCoffee.getDescription() + ",cost:" + syrupCoffee.getCost());}}

项目地址: https://gitee.com/htzGittee/design-patterns/tree/master/designPatterns