Design 装饰器模式

基本介绍

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

特点:动态地给一个对象添加一些额外的职责

常用于扩展一个类的功能,同时这个新增的功能与原本的类没有任何关联,可以动态的进行撤销。

案例图示

在蜘蛛侠被蜘蛛咬之前,他只是一个普通人,但是被蜘蛛咬了之后,他具有了一些超能力。

同时,如果超能力在未来某一天没有了,他依然还是一个普通人:

image-20210413145433130

优缺点

优点:

  • 装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能

缺点:

  • 多层装饰比较复杂

Python实现

用Python实现装饰器模式:

#! /usr/local/bin/python3
# -*- coding:utf-8 -*-

class Superpower(object):

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

    def climb_the_wall(self):
        print("%s在爬墙" % self.name)

    def cobweb(self):
        print("%s在吐蛛丝" % self.name)


class Person(object):
    # 大多数人都没有超能力,设置默认参数
    def __init__(self, name, capable=None):
        self.name = name
        self.__capable = capable(name) if callable(capable) else None

    def eat(self):
        print("%s在吃饭" % self.name)

    def walk(self):
        print("%s在走路" % self.name)

    def __getattr__(self, item):
        if hasattr(self.__capable, item):
            return getattr(self.__capable, item)
        raise AttributeError("%s没有这个能力:%s" % (self.name, item))


if __name__ == '__main__':
    parker = Person("彼得帕克", capable=Superpower)
    parker.eat()
    parker.cobweb()
    parker.climb_the_wall()

    ming = Person("小明")
    ming.eat()
    ming.cobweb()

结果如下:

彼得帕克在吃饭
彼得帕克在吐蛛丝
彼得帕克在爬墙
小明在吃饭
raise AttributeError("%s没有这个能力:%s" % (self.name, item))
AttributeError: 小明没有这个能力:cobweb

Golang实现

用Golang实现装饰器模式:

...
posted @ 2021-04-13 17:40  云崖君  阅读(46)  评论(0编辑  收藏  举报