设计原则:
1.找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起
2.针对接口编程,而不是针对实现编程
3.多用组合,少用继承
4.为交互对象之间松耦合设计而努力
5.类应该对扩张开放,对修改关闭
6.要依赖于抽象类,不要依赖于具体类
7.最少知识原则:只和你的密友谈话
8.好莱坞原则:别调用我们,我们会调用你
9.一个类应该只有一个引起变化的原因
设计模式:
1.策略模式:
策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
2.观察者模式:
定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
3.装饰者模式:
动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
4.工厂方法模式(Factory Method Pattern):定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
简单工厂模式用来封装对象的创建。
简单工厂和工厂方法模式之间的区别:简单工厂把全部的事情在一个地方都处理完了,然而工厂方法却是创建一个框架,让子类决定要如何实现。
5.抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体的类。
6.单件模式(Singleton Pattern):确保一个类只有一个实例,并提供一个全局访问点。
7.命令模式:命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
8.适配器模式:适配器模式将一个类的接口,转换成客户期望的另一个接口。适配器让原本就看不兼容的类可以合作无间。
对象适配器和类适配器使用两种不同的适配方法(分别是组合与继承)。
9.外观模式:外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
三个模式的目的:
装饰者模式:不改变接口,但加入责任
适配器模式:讲一个接口转换成另一个接口
外观模式:让接口更简单
10.模板方法模式:
模板方法模式:模板方法模式在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
模板就是一个方法,具体地说,这个方法将算法定义一组步骤,其中的任何步骤都可以是抽象的,由子类实现。这可以确保算法的结构保持不变,同时由子类提供部分实现。
比较一下三个模式的区别:
模板方法:封装可互换的行为,然后使用委托来决定要采用哪一个行为。
策略:子类决定如何实现算法中的 步骤
工厂方法:由子类决定实例化哪个具体类
11.迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露其内部的表示。
12.组合模式:组合模式允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。
几种模式的比较:
策略模式:封装可互换的行为,并使用委托决定使用哪一个
适配器模式:改变一个或多个接口
迭代器模式:提供一个方法来遍历集合,而无需暴露集合的实现
外观:简化一群类的接口
组合:客户可以将对象的集合以及个别的对象一视同仁
观察者:当某个状态改变时,允许一群对象能被通知到
13.状态模式:状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
区别以下几个模式:
状态模式:封装基于状态的行为,并将行为委托到当前状态。
策略模式:将可以互换的行为封装起来,然后使用委托的方法,决定使用哪一个行为。
模板模式:由子类决定如何实现算法中的某些步骤。
14.代理模式:代理模式为另一个对象提供一个替代或占位符以控制对这个对象的访问。
区分以下模式:
装饰者: 包装另一个对象,并提供额外的行为
外观: 包装许多对象以简化他们的接口
代理: 包装另一个对象,并控制对它的访问
适配器: 包装领一个对象,并提供不同的接口
15.复合模式:复合模式结合两个或两个以上的模式,组成一个解决方案,解决一在发生的一般性问题。
MVC是复合模式,结合了观察者,策略模式和组合模式。
总结:
装饰者:包装一个对象,以提供新的行为
状态:封装了基于状态的行为,并使用委托在行为之间切换
迭代器:在对象的集合之中游走,而不暴露集合的实现
外观:简化一群类的接口
策略:封装可以互换的行为,并使用委托来决定要使用哪一个
代理:包装对象,以控制对此对象的访问
工厂方法:由子类决定要创建的具体类是哪一个
适配器:封装对象,并提供不同的接口
观察者:让对象能够在状态改变时被通知
模板方法:有子类决定如何实现一个算法中的步骤
组合:客户用一致的方法处理的对象集合和单个对象
单件:确保有且只有一个对象被创建
抽象工厂:允许客户创建对象的家族,而无需指定他们的具体类
命令:封装请求成为对象
16.桥接:使用桥接不知改变你的实现,也改变你的抽象
17.生成器:使用生成器模式封装一个产品的构造过程,并允许按步骤构造
18.责任链:当你想要一个以上的对象有机会能够处理某个请求的时候,就使用责任链模式
19蝇量:如果想让某个类的一个实例能用来提供许多虚拟实例,就使用蝇量模式
20.解释器:使用解释器模式为语言创建解释器
21.中介者:使用中介者模式来集中相关对象之间复杂的沟通和控制方法
22.备忘录:当你需要让对象返回之前的状态时,就使用备忘录模式
23.原型:当创建给定类的实例的过程很昂贵或很复杂时,就使用原型模式
24.访问者:当你想要为一个对象的组合增加新的能力,且封装并不重要时,就使用访问者模式