《Head First》这本书是我觉得理解设计模式最棒的书本。至于其神奇之处,我想看过此书的人都会跟我一样的感慨!
面向对象基础
1、抽象
2、封装
3、继承
4、多态
设计原则
1、找出应用中可能需要变化的地方,把它独立出来,不要和那些不需要变化的混淆在一起。把变化的部分“封装”
2、针对接口编程,而不是实现编程。把行为放在分开的类中,此类专门提供某行为接口的实现
3、多用组合,少用继承。“有一个”可能比“是一个”更好。例如接口变成具体行为,变成某个对象的有一个行为。
4、为了交互对象之间松耦合设计而努力。这个也是要靠接口和委托为入口,不然它们之间没有“途径”进行沟通。
5、类应该对扩展开放,对修改关闭。
6、要依赖抽象,不要依赖具体类。看看工厂方法,把创建方法抽象成接口,然后创建对象时候是调用统一工厂而不是具体类去new。
7、最少知识原则,只和你的密友谈话。
8、好莱坞原则,别调用(打电话给)我,我会调用(打电话给)你。模板方法中高层组件和低层组件之间的解耦。
9、一个类应该只有一个引起变化的原因。尽量让每个类保持一种责任。
策略模式
定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
封装可以互换的行为,并用委托来决定使用哪一个。
观察者模式
定义了对象之间的一对多关系,这样,当一个对象改变状态时候,它的所有监听者便能收到通知并自动更新。
3个关键词:registerObserver(),removeObserver(),notifyObservers()
目地:让对象能在变化时候收到通知。
装饰者模式
动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
通过继承包装一个对象,以扩展新的功能。
工厂模式
定义了一个创建对象的接口,但由具体子类决定要实例化的类是哪一个。让类的实例化推迟到子类。
例如:纽约工厂、北京工厂,他们创造的方法接口一样,但产品不一样。就是将创建对象的代码封装起来。
抽象工厂模式
提供一个接口,用于创建相关或者依赖对象的家族,而不需要明确指定具体类。
工厂方法是创建一个对象的方法,那么抽象工厂是把创建对象相关的流程组合起来抽象成一堆方法接口。允许客户创建一个产品的家族,而无需知道具体类。
单件模式
确保一个类只有一个实例,并提供一个全局访问点。
构造方法私有化,提供shareInstance方法访问。
命令模式
将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
也可以说把行为变成具体对象,可以动态切换。类似策略模式。以及服务器处理“请求”,也就是请求对象放到队列里面。
适配器模式
将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
适配器对象里面组合了另外的对象,但继承了原本接口。原本接口调用其实就是调用组合的对象的实际方法。
外观模式
提供了一个统一的接口,用来访问子类系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
例如电视遥控打开电视机这个方法。
模板方法模式
在一个方法种定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
模板方法就是一个方法,只是把实现分成各个步骤,然后这些步骤是由子类方法去决定的。
模板方法通常有一个“钩子”,可以让子类去实现很多其他事情。让算法留有余地,能被更好利用和控制。
迭代器模式
提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的组合方式。
例如Hashtable、ArrayList等组合都可以提供一个Iterator迭代器。
关键词:Iterator\hasNext\next\remove
*空对象模式
空迭代器,当没有任何可以遍历时候,可以createIterator()返回空迭代器,这个迭代器的接口方法返回永远是false,这样不担心改变这种模式的“空问题”。
组合模式
允许你将对象组合成树形结构来表现“整体\部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。
关键词:addChild\remove\getChild
关联:例如Unity3d中的Component,例如cocos2d中的Node节点
状态模式
允许对象在内部状态改变时候改变它的行为,对象看起来好像修改了它的类。
这个模式将状态封装成独立的类,接口为State,并在运行过程中把动作委托给当前的状态对象。
联系:AI行为处理,状态机之间的切换
代理模式
为另一个对象提供一个替身或占位符以控制对这个对象的访问。
使用代理模式创建代表对象,让代表对象控制某对象的访问或者做额外的处理和包装。被代理的对象可以是远程的对象,创建开销大的对象或者需要安全控制的对象。
复合模式
结合2个或者以上的模式,组合成一个解决方案。
关联:典型的MVC,Model处理应用数据和数据逻辑,没有视图关系;View是负责显示的组件,以及控制组件的方式,但不负责对组件做具体事情;Controller控制View的动作,以及通知Model做某些事情,就是View和Model的控制者。
最后附上模式的分类