书上,真的用一个人穿衣打拌来讲解装饰模式的呢。

  1. from abc import ABCMeta, abstractmethod
  2.  
  3. class Person(metaclass=ABCMeta):
  4.  
  5. def __init__(self, name):
  6. self._name = name
  7.  
  8. @abstractmethod
  9. def wear(self):
  10. print("着装。。。")
  11.  
  12. class Engine(Person):
  13.  
  14. def __init__(self, name, skill):
  15. super().__init__(name)
  16. self.__skill = skill
  17.  
  18. def get_skill(self):
  19. return self.__skill
  20.  
  21. def wear(self):
  22. print("我是{}工程师{}。".format(self.get_skill(), self._name))
  23. super().wear()
  24.  
  25. class Teacher(Person):
  26.  
  27. def __init__(self, name, title):
  28. super().__init__(name)
  29. self.__title = title
  30.  
  31. def get_title(self):
  32. return self.__title
  33.  
  34. def wear(self):
  35. print("我是{}{}。".format(self._name, self.get_title() ))
  36. super().wear()
  37.  
  38. class ClothingDecorator(Person):
  39.  
  40. def __init__(self, person):
  41. self._decorated = person
  42.  
  43. def wear(self):
  44. self._decorated.wear()
  45. self.decorate()
  46.  
  47. @abstractmethod
  48. def decorate(self):
  49. pass
  50.  
  51. class CasualPantDecorator(ClothingDecorator):
  52.  
  53. def __init__(self, person):
  54. super().__init__(person)
  55.  
  56. def decorate(self):
  57. print("一条卡其色休闲裤")
  58.  
  59. class BeltDecorator(ClothingDecorator):
  60.  
  61. def __init__(self, person):
  62. super().__init__(person)
  63.  
  64. def decorate(self):
  65. print("一条银色针扣头的黑色腰带")
  66.  
  67. class LeatherShoeDecorator(ClothingDecorator):
  68.  
  69. def __init__(self, person):
  70. super().__init__(person)
  71.  
  72. def decorate(self):
  73. print("一双深色休闲皮鞋")
  74.  
  75. class KnittedSweaterDecorator(ClothingDecorator):
  76.  
  77. def __init__(self, person):
  78. super().__init__(person)
  79.  
  80. def decorate(self):
  81. print("一件紫红色针织毛衣")
  82.  
  83. class WhiteShirtDecorator(ClothingDecorator):
  84.  
  85. def __init__(self, person):
  86. super().__init__(person)
  87.  
  88. def decorate(self):
  89. print("一件白色衬衫")
  90.  
  91. class GlassesDecorator(ClothingDecorator):
  92.  
  93. def __init__(self, person):
  94. super().__init__(person)
  95.  
  96. def decorate(self):
  97. print("一副方形黑框眼镜")
  98.  
  99. def test_decorator():
  100. tony = Engine("Tony", "客户端")
  101. pant = CasualPantDecorator(tony)
  102. belt = BeltDecorator(pant)
  103. shoes = LeatherShoeDecorator(belt)
  104. shirt = WhiteShirtDecorator(shoes)
  105. sweater = KnittedSweaterDecorator(shirt)
  106. glasses = GlassesDecorator(sweater)
  107. glasses.wear()
  108.  
  109. print()
  110. decorator_teacher = GlassesDecorator(WhiteShirtDecorator(LeatherShoeDecorator(Teacher("wells", "教授"))))
  111. decorator_teacher.wear()
  112.  
  113. test_decorator()
  1. C:\Python36\python.exe C:/Users/Sahara/PycharmProjects/test1/test.py
  2. 我是客户端工程师Tony
  3. 着装。。。
  4. 一条卡其色休闲裤
  5. 一条银色针扣头的黑色腰带
  6. 一双深色休闲皮鞋
  7. 一件白色衬衫
  8. 一件紫红色针织毛衣
  9. 一副方形黑框眼镜
  10.  
  11. 我是wells教授。
  12. 着装。。。
  13. 一双深色休闲皮鞋
  14. 一件白色衬衫
  15. 一副方形黑框眼镜
  16.  
  17. Process finished with exit code

<人人都懂设计模式>-装饰模式的更多相关文章

  1. 《Android源码设计模式》学习笔记之ImageLoader

    微信公众号:CodingAndroid cnblog:http://www.cnblogs.com/angel88/ CSDN:http://blog.csdn.net/xinpengfei521 需 ...

  2. 《Android源码设计模式》--抽象工厂模式

    No1: 4种MediaPlayer Factory分别会生成不同的MediaPlayer基类:StagefrightPlayer.NuPlayerDriver.MidiFile和TestPlayer ...

  3. 《Android源码设计模式》--Builder模式

    No1: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 No2: 在Android源码中,最常用到的Builder模式就是AlertDialog.Builder No3: ...

  4. 《Android源码设计模式》--装饰模式

    No1: Activity继承于ContextThemeWrapper,继承于ContextWrapper,继承于Context. No2: Context中方法的所有实现均由ContextImpl类 ...

  5. 《Android源码设计模式》--模板方法模式

    No1: 模板方法模式包括:抽象类(其中定义了一系列顺序方法).具体实现类A.具体实现类B 如果子类有实现不一样的细节,重写父类的某个方法即可 No2: AsyncTask对象调用execute方法后 ...

  6. 《Android源码设计模式》--状态模式--责任链模式--解释器模式--命令模式--观察者模式--备忘录模式--迭代器模式

    [状态模式] No1: Wifi设置界面是一个叫做WifiSetting的Fragment实现的 No2: 在不同的状态下对于扫描Wifi这个请求的处理是完全不一样的.在初始状态下扫描请求被直接忽略, ...

  7. 《Android源码设计模式》--享元模式

    No1: 享元模式是对象池的一种实现.享元模式用来尽可能减少内存使用量,它适合用于可能存在大量重复对象的场景,来缓存可共享的对象,达到对象共享.避免创建过多对象的效果,这样一来就可以提升性能.避免内存 ...

  8. 《Android源码设计模式》--策略模式

    No1: 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. No2: 使用场景: 1)针对同一类型问题的多种处理方式,仅 ...

  9. 《Android源码设计模式》--工厂方法模式

    No1: 对于一个应用程序来说,其真正的入口是在ActivityThread类中,ActivityThread中含有我们熟悉的main方法.ActivityThread是一个final类,不能被继承. ...

  10. 《Android源码设计模式》--原型模式

    No1: 原型模式使用场景: 1)类初始化需要消耗非常多的资源,这个资源包括数据.硬件资源等,通过原型复制避免这些消耗 2)通过new产生一个对象需要非常繁琐的数据准备货访问权限,这是可以使用原型模式 ...

随机推荐

  1. Linux性能优化实战学习笔记:第二十一讲

    一 内存性能指标 1.系统内存使用情况 共享内存:是通过tmpfs实现的,所以它的大小也就是tmpfs使用的大小了tmpfs其实也是一种特殊的缓存 可用内存:是新进程可以使用的最大内存它包括剩余内存和 ...

  2. sonatype nexus安装教程

    1. 安装nexus前需要先安装maven.(详见jdk安装教程)2. 将nexus-2.0.2.rar放到d:\teamwork中,点击右键,解压到当前文件夹中.其中包含两个文件夹:nexus,so ...

  3. dataframe 基本操作

    package com.jason.example import org.apache.spark.sql.functions.broadcast class DFTest extends Spark ...

  4. python字符串格式化方法%s和format函数

    1.%s方法 一个例子 print("my name is %s and i am %d years old" %("xiaoming",18) 输出结果:my ...

  5. FFT(快速傅里叶变换)

    FFT(快速傅里叶变换) 前置知识 \(1.复数\) \(2.单位根\) \(3.循环结构\) \(4.C++\) 1.复数 \(定义:形如a+bi的数,其中i^2=-1\) \(计算:1.(a+bi ...

  6. 本周学习总结(原生+Echarts地图)

    本周主要想完成工作中大屏地图相关的知识,所以学习的时间不是很长 dsa.js(数据结构) 拖了两个星期还没看,等啥时候继续研究算法和数据结构再看源码 GoJS 有时间要好好研究下 https://gi ...

  7. sql server锁表、查询被锁表、解锁被锁表的相关语句

    MSSQL(SQL Server)在我的印象中很容易锁表,大致原因就是你在一个窗口中执行的DML语句没有提交,然后又打开了一个窗口对相同的表进行CRUD操作,这样就会导致锁表.锁表是一种保持数据一致性 ...

  8. java poi 读取有密码加密的Excel文件

    String excelPath = "Excel文件路徑"; String password = "Excel文件密碼"; Workbook workbook ...

  9. 脱离 WebView 的通信 JavaScriptCore

    JavascriptCore JavascriptCore 一直作为 WebKit 中内置的 JS 引擎使用,在 iOS7 之后,Apple 对原有的 C/C++ 代码进行了 OC 封装,成为系统级的 ...

  10. 线程之间灵活传递信号(ManualResetEventSlim )

    当主程序启动时,首先创建ManualResetEventSlim 类的一个实例.然后启动三个线程,等待事件信号通知它们继续执行. /// <summary> /// 创建 ManualRe ...