共计 2255 个字符,预计需要花费 6 分钟才能阅读完成。
知名气人小说写手
2023-07-19 09:46:33
浏览数 (1217)
装饰器模式是一种常用的设计模式,它允许在不改变对象结构的情况下,动态地为对象添加额外的功能。通过装饰器模式,我们可以在运行时将一个对象包装在另一个对象中,从而以一种优雅、灵活的方式扩展对象的功能。本文将详细介绍装饰器模式的定义、结构、工作原理,并通过示例演示其在实际应用中的用途。
定义
装饰器模式是一种结构型设计模式,它允许向一个现有对象添加新的功能,同时又不改变其结构。装饰器模式通过将对象包装在一个装饰器中,来动态地扩展对象的功能。
结构
- Component(组件接口):定义了被装饰对象和装饰器共同的接口,可以是抽象类或接口。
- ConcreteComponent(具体组件):实现了组件接口,是被装饰对象。
- Decorator(装饰器抽象类):继承自组件接口,包含一个对组件的引用,并定义一个与组件接口一致的接口。
- ConcreteDecorator(具体装饰器):继承自装饰器抽象类,实现了装饰器的接口,负责对被装饰对象进行扩展。
工作原理
装饰器模式通过递归组合,将一个或多个具体装饰器包裹在被装饰对象上。每个具体装饰器可以独立地扩展被装饰对象的功能,而客户端代码可以在运行时动态地添加或移除装饰器,实现灵活的功能组合。
示例
咖啡和调料
假设我们有一个咖啡店,它提供不同种类的咖啡。我们可以用装饰器模式来实现给咖啡添加调料的功能。
// Component: 咖啡接口
interface Coffee {String getDescription();
double getCost();}
// ConcreteComponent: 具体咖啡类
class SimpleCoffee implements Coffee {
@Override
public String getDescription() {return "Simple Coffee";}
@Override
public double getCost() {return 5.0;}
}
// Decorator: 装饰器抽象类
abstract class CoffeeDecorator implements Coffee {
protected Coffee decoratedCoffee;
public CoffeeDecorator(Coffee coffee) {this.decoratedCoffee = coffee;}
}
// ConcreteDecorator: 具体调料类
class MilkDecorator extends CoffeeDecorator {public MilkDecorator(Coffee coffee) {super(coffee);
}
@Override
public String getDescription() {return decoratedCoffee.getDescription() + ", Milk";
}
@Override
public double getCost() {return decoratedCoffee.getCost() + 2.0;
}
}
// ConcreteDecorator: 具体调料类
class SugarDecorator extends CoffeeDecorator {public SugarDecorator(Coffee coffee) {super(coffee);
}
@Override
public String getDescription() {return decoratedCoffee.getDescription() + ", Sugar";
}
@Override
public double getCost() {return decoratedCoffee.getCost() + 1.5;
}
}
// 客户端代码
public class Main {public static void main(String[] args) {
// 创建一个简单咖啡
Coffee simpleCoffee = new SimpleCoffee();
System.out.println("Description:" + simpleCoffee.getDescription());
System.out.println("Cost: $" + simpleCoffee.getCost());
// 添加调料:牛奶和糖
Coffee coffeeWithMilkAndSugar = new MilkDecorator(new SugarDecorator(simpleCoffee));
System.out.println("Description:" + coffeeWithMilkAndSugar.getDescription());
System.out.println("Cost: $" + coffeeWithMilkAndSugar.getCost());
}
}
输出结果:
Description: Simple Coffee
Cost: $5.0
Description: Simple Coffee, Sugar, Milk
Cost: $8.5
结语
装饰器模式是一种非常有用的设计模式,它允许在不改变现有代码的情况下,通过动态地添加装饰器来扩展对象的功能。通过组合不同的装饰器,我们可以轻松地实现各种功能组合,使代码更加灵活和可维护。在实际应用中,装饰器模式常常用于增强已有的类库或框架的功能,以及在不修改源代码的情况下为对象添加新的行为。
学 java,就到 java 编程狮 !
原文地址: 深入解析装饰器模式:优雅地扩展对象功能