本书上传的所有代码都是可以运行的,在此附上本书源码地址: http://www.ituring.com.cn/book/1811
在此向本书作者和译者表示感谢
本书采用的是Java版本,笔者采用的Python语言实现所有设计模式,如果大家要参考Java版本的设计模式,可以链接到以下地址:
https://github.com/Relph1119/GraphicDesignPattern
Python 版本:3.7.2
PyCharm 版本:PyCharm 2017.3.3 (Professional Edition)
src +---abstractFactory------------------------抽象工厂模式 +---adapter--------------------------------适配器模式 +---bridge---------------------------------桥接模式 +---builder--------------------------------建造者模式 +---chainOfResponsibility------------------职责链模式 +---command--------------------------------命令模式 +---composite------------------------------组合模式 +---decorator------------------------------装饰者模式 +---facade---------------------------------外观模式 +---factoryMethod--------------------------工厂模式 +---flyweight------------------------------享元模式 +---interpreter----------------------------解释器模式 +---iterator-------------------------------迭代模式 +---mediator-------------------------------中介者模式 +---memento--------------------------------备忘录模式 +---observer-------------------------------观察者模式 +---prototype------------------------------原型模式 +---proxy----------------------------------代理模式 +---singleton------------------------------单例模式 +---state----------------------------------状态转换模式 +---strategy-------------------------------策略模式 +---templateMethod-------------------------模版模式 +---visitor--------------------------------访问者模式 images-------------------------------------运行结果截图
- 前后用了2天多的时间用Python重写了一遍《图解设计模式》中的示例代码,对于Python语言的使用更加熟练了。
- 上面23个设计模式,只有Mediator模式的重写还没有完成,程序总是报错,可能不支持tkinter的控件继承,该模式的Main.py是整合好的程序,可以运行。
- 对于Facade模式中的读取maildata.txt文件,由于Python没有Java Properties的类,笔者参照网上的方法,自己实现了一个。
- 对于Interpreter模式中词分处理,由于没有Java StringTokenizer类,笔者直接在Context中实现了该类的方法。
- 其中的几个GUI编程,采用的是Python自带的tkinter包,目前已经熟练使用Text, Button, Canvas, Label, Entry等控件。
- 2018年12月5日 按照Effective Python中的进行代码优化。
- 2018年12月21日 按照PEP8 进行代码优化。
- 对于Python的循环继承的处理,可以所用到的方法内声明导入类。
- 针对Python的动态读取类信息,并生成类的实例可采用以下代码实现
@staticmethod def get_factory(module_name, class_name): module = importlib.import_module(module_name) aclass = getattr(module, class_name) factory = aclass() return factory
class Print(object): @classmethod def print_weak(cls): pass @classmethod def print_strong(cls): pass4. 在主程序内开启子线程,退出主程序之后,子线程依然会执行,可以采用标志位判断之后break,退出子线程,可参考State模式的示例代码。
以下内容引用Python开发手册中关于杀死线程的警告:
不要试图用强制方法杀掉一个python线程,这从服务设计上就存在不合理性。 多线程本用来任务的协作并发,如果你使用强制手段干掉线程,那么很大几率出现意想不到的bug。