📜  装饰者模式 |套装 2(介绍和设计)(1)

📅  最后修改于: 2023-12-03 15:41:33.050000             🧑  作者: Mango

装饰者模式 |套装 2(介绍和设计)

介绍

装饰者模式是一种结构型设计模式。它允许你动态地添加行为或修改已有行为的方式,而不是使用继承来达到这个目的。

在装饰者模式中,你从简单的对象开始,然后通过添加装饰器来增加它们的功能。每个装饰器都增加一个特定的行为,它们可以像套娃一样嵌套使用,以构建一系列装饰器来实现特定的行为。

这个模式的主要优点在于它允许你动态地扩展一个对象的功能,而无需直接修改该对象的代码。

设计

在装饰者模式中,有一个基础接口或基础类,它定义了一些基础行为。我们可以创建一个具体的类来实现这个接口或继承这个基础类。

使用这个基础类或接口的实例作为参数,我们可以创建一个装饰器,它可以增加特定的行为。这个装饰器重载了基础接口中的方法,并在其中添加了特定的行为,然后在最后调用其它组件的方法来完成其任务。

我们还可以创建一个装饰器的装饰器,以增加更多的行为。这个装饰器与一般的装饰器类似,但它只是接受了另一个装饰器作为参数。

每个装饰器都可以按任意顺序嵌套在一起,因此我们可以构建一个具有复杂行为的对象。

代码示例

下面是一个使用装饰者模式的代码示例,其中我们可以使用所谓的“套装”,来动态地给人物添加武器和盔甲。

首先,我们创建一个具有基础功能(即仅仅有名字)的角色类:

class Character:
    def __init__(self, name):
        self.name = name

    def get_details(self):
        return self.name

然后,我们创建一个武器装饰器,它将在角色前面添加一个武器的名称:

class WeaponDecorator:
    def __init__(self, character, weapon_name):
        self.character = character
        self.weapon_name = weapon_name

    def get_details(self):
        return self.weapon_name + " " + self.character.get_details()

接下来,我们创建一个盔甲装饰器,它将在角色后面添加一件盔甲的名称:

class ArmorDecorator:
    def __init__(self, character, armor_name):
        self.character = character
        self.armor_name = armor_name

    def get_details(self):
        return self.character.get_details() + ", " + self.armor_name

最后,我们可以使用这些装饰器来创建一个拥有武器和盔甲的角色:

# 创建一个名叫“Arthur”的角色
arthur = Character("Arthur")

# 给他一个剑
arthur_with_sword = WeaponDecorator(arthur, "sword")

# 再给他穿上一件盔甲
arthur_with_sword_and_armor = ArmorDecorator(arthur_with_sword, "armor")

# 打印出角色的描述
print(arthur_with_sword_and_armor.get_details())

这将输出 sword Arthur, armor

在这个示例中,我们可以看到装饰器是如何按顺序嵌套的,从而创建一个更加丰富的角色。