Spring 设计模式之装饰器模式
装饰器模式
装饰器模式允许我们在不修改原始类(即被装饰对象)的情况下,动态地向对象添加新的行为或修改现有行为。
用到的场景
存在一个原始类,在不改动原始类的基础上,新建一个类来继承原始类里面的方法或者改动这些方法,亦可增加独属于自己的方法。
简单来说就是以原始类为原型进行扩展
需要存在的核心类:
1.原始类
2.装饰器基类(抽象)
3.具体的装饰类
具体的java例子:
java
// 假设 Coffee 是一个接口,定义了咖啡的基本属性和方法
public interface Coffee {
String getDescription();
double getCost();
}
// 原始类;基本的咖啡实现
class BasicCoffee implements Coffee {
@Override
public String getDescription() {
return "基础咖啡";
}
@Override
public double getCost() {
return 2.0;
}
}
// 装饰器基类,持有对另一个 Coffee 对象的引用
abstract class Decorator implements Coffee {
protected Coffee coffee;
public Decorator(Coffee coffee) {
this.coffee = coffee;
}
@Override
public String getDescription() {
return coffee.getDescription();
}
@Override
public double getCost() {
return coffee.getCost();
}
}
// 具体的装饰器,添加牛奶
class MilkDecorator extends Decorator {
public MilkDecorator(Coffee coffee) {
super(coffee);
}
@Override
public String getDescription() {
return coffee.getDescription() + ",加牛奶";
}
@Override
public double getCost() {
return coffee.getCost() + 0.5; // 假设加牛奶要额外0.5美元
}
}
// 具体的装饰器,改描述、改价格
class GzDecorator extends Decorator {
public GzDecorator(Coffee coffee) {
super(coffee);
}
@Override
public String getDescription() {
return "换描述了:GzDecorator";
}
@Override
public double getCost() {
return 100; //
}
}
// 具体的装饰器,改描述、改价格
class TjDecorator extends Decorator {
public TjDecorator(Coffee coffee) {
super(coffee);
}
@Override
public String getDescription() {
return "换描述了:TjDecorator";
}
@Override
public double getCost() {
return 100; //
}
public String addSomethingSpecial() {
return "我自己加的新方法哦...";
}
}
// 使用示例
class Main {
public static void main(String[] args) {
// 创建一个基础咖啡对象
Coffee coffee = new BasicCoffee();
System.out.println("装饰前: " + coffee.getDescription() + " - $" + coffee.getCost());
// 第一个装饰器:加牛奶
coffee = new MilkDecorator(coffee);
System.out.println("加牛奶后: " + coffee.getDescription() + " - $" + coffee.getCost());
// 第二个装饰器:GzDecorator(换描述、换价格)
coffee = new GzDecorator(coffee);
System.out.println("GzDecorator装饰后: " + coffee.getDescription() + " - $" + coffee.getCost());
// 注意:这里我们不再将TjDecorator直接创建为TjDecorator coffee1,而是也作为coffee的一个装饰器
// 第三个装饰器:TjDecorator(换描述、换价格,并添加新方法)
coffee = new TjDecorator(coffee);
System.out.println("TjDecorator装饰后: " + coffee.getDescription() + " - $" + coffee.getCost()
+ " " + ((TjDecorator) coffee).addSomethingSpecial()); // 需要强制类型转换来调用addSomethingSpecial()
}
}
输出结果
javascript
装饰前: 基础咖啡 - $2.0
装饰后: 基础咖啡,加牛奶 - $2.5
装饰后: 换描述了:GzDecorator - $100.0
装饰后: 换描述了:TjDecorator - $100.0 我自己加的新方法哦...