允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
我们通过下面的实例来演示装饰器模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。
img
装饰器模式.jpg
简单装饰器
在原类型基础上扩展
class ClsA:
def __init__(self):
super().__init__()
self.count = 0
print('I\'m A count:%d'%self.count)
class ClsA_decorated_after:
def __init__(self, a:ClsA):
super().__init__()
self.a = a
self.a.count+=1
@property
def count(self):
return self.a.count
class ClsA_decorated_after2:
def __init__(self, a:ClsA_decorated_after):
super().__init__()
self.a = a
self.a.a.count+=1
@property
def count(self):
return self.a.a.count
if __name__ == '__main__':
a = ClsA()
b = ClsA_decorated_after(ClsA())
c = ClsA_decorated_after2(ClsA_decorated_after(ClsA()))
print(a.count, b.count, c.count)
模块化装饰器
import abc
class idecorator(metaclass=abc.ABCMeta):
@abc.abstractmethod
def reset(self):
pass
@abc.abstractproperty
def count(self):
return 'get count'
@abc.abstractmethod
@count.setter
def count(self, count):
return 'set count'
class ClsA(idecorator):
def __init__(self):
super().__init__()
self._count = 0
print('创建了%s'%self.__class__.__name__)
def reset(self):
print(self.count)
@property
def count(self):
return self._count
@count.setter
def count(self, count):
self._count = count
class ClsA_d1(idecorator):
def __init__(self, a:idecorator):
self.a = a
print('创建了%s'%self.__class__.__name__)
def reset(self):
self.count+=10
self.a.reset()
@property
def count(self):
return self.a.count
@count.setter
def count(self, count):
self.a.count = count
class ClsA_d2(idecorator):
def __init__(self, a:idecorator):
self.a = a
print('创建了%s'%self.__class__.__name__)
def reset(self):
self.a.count+=4
self.a.reset()
@property
def count(self):
return self.a.count
@count.setter
def count(self, count):
self.a.count = count
if __name__ == '__main__':
a = ClsA()
a.reset()
b = ClsA_d1(ClsA())
b.reset()
c = ClsA_d2(ClsA_d1(ClsA()))
c.reset()
d = ClsA_d2(ClsA())
d.reset()
文末
欢迎关注我的简书,分享Android干货,交流Android技术。
对文章有何见解,或者有何技术问题,都可以在评论区一起留言讨论,我会虔诚为你解答。
最后,如果你想知道更多Android的知识或需要其他资料我这里均免费分享,只需点赞+评论来找我获取哦。













网友评论