我的理解是建立在C++上的,而书中所用的例子是java的,每一种模式我都会转化为C++中的应用来理解。
1.简单工厂模式:
我的理解是父类定义接口,子类实现接口,外加一个根据输入产生不同子类的函数。如果需要添加新实现时,需要添加子类,和修改工厂函数。
2.策略模式:
简单一点的理解是将工厂函数和父类定义在一个新的类中,那么客户端的代码就会显得简洁一些。比较重要的一点是接口和客户端的耦合度降低了。两个类改为一个类。
3.单一职责原则:
还是耦合度的问题,如果太多的功能集中在一个类中,成员变量数量的上升和变动,会让类显得复杂,耦合度太高,不利于维护。仅有一个动机会让你去改变一个类。
4.开放封闭原则:
当有新的需求来到时,可以添加新的功能,但不改变原有的代码。
5.依赖倒转原则:
针对接口编写代码。
6.装饰模式:
子类继承父类,重写父类接口,并且有一个指向父类的指针。每个子类在该接口中有自己的操作,并且通过父类指针调用父类接口。注意:子类中需添加一个函数,将成员变量指向父类的指针指向新的子类。在客户端,创建多个子类,按照需求,调用子类的函数使得指向父类的指针层层迭代,当最后一个子类调用重写的接口时,便依次调用了各子类功能。这个模式我觉得可以和单一职责结合,每个子类只负责自己的功能,但在客户端实现具体的功能组合。
7.代理模式:
这个模式我的理解是写两个子类,一个子类A实现父类定义的接口,一个子类B包含一个指向子类的指针,同时也实现父类接口,该实现一般会调用A的接口。在客户端使用的是子类B。这样看不到一点好处,这个直接使用类A毫无区别。在我学习unix文件系统时 ,有一个类似(unix是C写的,但设计模式无关什么语言)的例子,文件表的作用,即使两个进程打开的是同一个文件,在文件表中会有两个槽,为什么呢,我觉得就和代理模式的一个应用相同,就是权限的控制。其他三种应用我还没有应用过,一个是虚代理,比较近的是打开一个文档时,文档已经打开很久了,但浏览到某些图片时还是需要等待,这就是一个代理的应用,在需要时才调用实际类的接口,有些类似于权限控制,第二个是智能指引,这个我觉得还是用文件表的例子理解,当文件表中的某个槽引用计数为0时,既可以将该槽再次使用。最后一种是远程代理,也是我比较不能理解的,复制一份原对象?
8.工厂方法模式:
相对简单工厂模式,简单工厂模式是在一个子类生成函数中生成具体对象,而工厂方法模式是把子类生成函数拆分,每个工厂子类生成一种具体的对象,说实话我觉得没什么好处。这是把选择放在业务还是自身的区别。
9.原型模式:
我觉得在C++中就是拷贝构造函数。
10.模版方法模式:
代码的复用,尽可能把子类中相同的实现放在父类中,而子类仅实现不同的部分。而这也是为什么要有子类和父类的原因。代码越少,越清晰。