装饰器模式:动态增强的艺术大师
装饰器模式是一种结构型设计模式,允许在不改变原有对象的基础上动态地扩展其功能。这种模式通过创建一系列装饰器类来包装原始对象,从而在运行时添加新的行为。装饰器模式的核心思想是“组合优于继承”,避免了因继承导致的类爆炸问题。
装饰器模式的核心组件
装饰器模式主要由以下几个组件构成:
- Component(抽象组件):定义原始对象的接口,可以是抽象类或接口。
- ConcreteComponent(具体组件):实现抽象组件的接口,是被装饰的原始对象。
- Decorator(抽象装饰器):继承或实现抽象组件,并持有对组件的引用。
- ConcreteDecorator(具体装饰器):实现抽象装饰器的接口,负责向组件添加新的行为。
装饰器模式的实现示例
以下是一个简单的装饰器模式实现示例,模拟为咖啡添加配料的场景。
# 抽象组件
class Coffee:
def cost(self):
pass
# 具体组件
class SimpleCoffee(Coffee):
def cost(self):
return 5
# 抽象装饰器
class CoffeeDecorator(Coffee):
def __init__(self, coffee):
self._coffee = coffee
def cost(self):
return self._coffee.cost()
# 具体装饰器:牛奶
class MilkDecorator(CoffeeDecorator):
def cost(self):
return self._coffee.cost() + 2
# 具体装饰器:糖
class SugarDecorator(CoffeeDecorator):
def cost(self):
return self._coffee.cost() + 1
# 使用示例
coffee = SimpleCoffee()
print(f"Simple coffee cost: {coffee.cost()}")
coffee_with_milk = MilkDecorator(coffee)
print(f"Coffee with milk cost: {coffee_with_milk.cost()}")
coffee_with_milk_and_sugar =
### 装饰器模式:动态增强的艺术大师
装饰器模式是一种结构型设计模式,允许在不改变原有对象的基础上动态地扩展其功能。这种模式通过创建一系列装饰器类来包装原始对象,从而在运行时添加新的行为。装饰器模式的核心思想是“组合优于继承”,避免了因继承导致的类爆炸问题。
#### 装饰器模式的核心组件
装饰器模式主要由以下几个组件构成:
- **Component(抽象组件)**:定义原始对象的接口,可以是抽象类或接口。
- **ConcreteComponent(具体组件)**:实现抽象组件的接口,是被装饰的原始对象。
- **Decorator(抽象装饰器)**:继承或实现抽象组件,并持有对组件的引用。
- **ConcreteDecorator(具体装饰器)**:实现抽象装饰器的接口,负责向组件添加新的行为。
#### 装饰器模式的实现示例
以下是一个简单的装饰器模式实现示例,模拟为咖啡添加配料的场景。
```python
# 抽象组件
class Coffee:
def cost(self):
pass
# 具体组件
class SimpleCoffee(Coffee):
def cost(self):
return 5
# 抽象装饰器
class CoffeeDecorator(Coffee):
def __init__(self, coffee):
self._coffee = coffee
def cost(self):
return self._coffee.cost()
# 具体装饰器:牛奶
class MilkDecorator(CoffeeDecorator):
def cost(self):
return self._coffee.cost() + 2
# 具体装饰器:糖
class SugarDecorator(CoffeeDecorator):
def cost(self):
return self._coffee.cost() + 1
# 使用示例
coffee = SimpleCoffee()
print(f"Simple coffee cost: {coffee.cost()}")
coffee_with_milk = MilkDecorator(coffee)
print(f"Coffee with milk cost: {coffee_with_milk.cost()}")
coffee_with_milk_and_sugar =
261

被折叠的 条评论
为什么被折叠?



