设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
设计模式分为三大类二十三种:
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
1、单一职责原则
不要存在多于一个导致类变更的原因,也就是说每个类应该实现单一的职责。
优点:
1.降低了类的复杂度,一个类只负责一个职责;
2.复杂度降低后,提升了类的可读性,提高系统的可读性及可维护性;
3.变更引起的风险降低,一个类只负责一个职责,修改一个类时,对其他类或者接口没有影响,这对系统的扩展性、维护性、稳定性都有很大的帮助。
2、里氏替换原则
所有引用基类(父类)的地方必须能透明地使用其子类的对象。
定义中包含的四层含义:
1.子类必须完全实现父类的方法;
2.子类可以增加自己特有的方法;
3.覆盖或实现父类的方法时输入参数要比父类方法的输入参数更宽松;
4. 覆写或实现父类的方法时输出结果要比父类更严格。
3、依赖倒置原则
面向接口编程,依赖于抽象而不依赖于具体。写代码时用到具体类时,不与具体类交互,而与具体类的上层接口交互。
4、接口隔离原则
一个类对另一个类的依赖应该建立在最小的接口上。
采用接口隔离原则对接口进行约束时,要注意以下几点:
1.接口尽量小,但是要有限度。对接口进行细化可以提高程序设计灵活性,但是如果过小,则会造成接口数量过多,使设计复杂化。所以一定要适度。
2.为依赖接口的类定制服务,只暴露给调用的类它需要的方法,它不需要的方法则隐藏起来。只有专注地为一个模块提供定制服务,才能建立最小的依赖关系。
3.提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。
5、迪米特原则
一个软件实体应当尽可能少地与其他实体发生相互作用。
6、开闭原则
一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
变化的三种类型:
①逻辑变化
只变化一个逻辑,而不涉及其他模块,比如原有的一个算法是a*b+c,现在需要修改为a*b*c,可以通过修改原有类中的方法的方式来完成,前提条件是所有依赖或关联类都按照相同的逻辑处理。
②子模块变化
一个模块变化,会对其他的模块产生影响,特别是一个低层次的模块变化必然引起高层模块的变化,因此在通过扩展完成变化时,高层次的模块修改是必然的。
③可见视图变化
可见视图是提供给客户使用的界面,如JSP程序、Swing界面等,该部分的变化一般会引起连锁反应(特别是在国内做项目,做欧美的外包项目一般不会影响太大)。可以通过扩展来完成变化,这要看我们原有的设计是否灵活。
1.Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点;
2. Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。
3.Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类。
4.Builder,建造模式:将一个复杂对象的构建与他的表示相分离,使得同样的构建过程可以创建不同的表示。
5.Prototype,原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象。
6.Iterator,迭代器模式:提供一个方法顺序访问一个聚合对象的各个元素,而又不需要暴露该对象的内部表示。
7.Observer,观察者模式:定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新。