一、设计模式:
设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。
二、设计原则:
为什么要提倡“Design Pattern呢?根本原因是为了代码复用,增加可维护性。那么怎么才能实现代码复用呢?面向对象有六大原则:单一职责原则 (Single Responsiblity Principle SRP)
开闭原则(Open Closed Principle,OCP)、
里氏代换原则(Liskov Substitution Principle,LSP)、
依赖倒转原则(Dependency Inversion Principle,DIP)、
接口隔离原则(Interface Segregation Principle,ISP)、合成/聚合复用原则(Composite/Aggregate Reuse Principle,CARP)、最小知识原则(Principle of Least Knowledge,PLK,也叫
迪米特法则)。开闭原则具有理想主义的色彩,它是面向对象设计的终极目标。其他几条,则可以看做是开闭原则的实现方法。
设计模式就是实现了这些原则,从而达到了代码复用、增加可维护性的目的。
SRP:单一职责原则即不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。
遵循单一职责原的优点有:
- 可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多;
- 提高类的可读性,提高系统的可维护性;
- 变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响。
OPC
:应对扩展开放,对于修改关闭,即应该尽量在不修改原来代码情况下进行扩展。例如”抽象工厂模式“。
LSP
:
里氏替换原则通俗的来讲就是:
子类可以扩展父类的功能,但不能改变父类原有的功能(例如子类的引用指向父类的对象)。
它包含以下4层含义:
- 子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
- 子类中可以增加自己特有的方法。
- 当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
- 当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。
DIP
:依赖倒置原则基于这样一个事实:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建起来的架构比以细节为基础搭建起来的架构要稳定的多。在Java中,抽象指的是接口或者抽象类,细节就是具体的实现类,使用接口或者抽象类的目的是制定好规范和契约,而不去涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成。(mother tell stories/paper...)
依赖倒置原则的核心思想是面向接口编程,
ISP
:接口隔离原则是客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。当一个接口会被多个类实现时,该接口中定义的方法必须是所有实现类都需用到的意义的方法,一旦有有个别实现类不需要实现某个别的方法时,需将本接口拆分为更小更独立的接口。
采用接口隔离原则对接口进行约束时,要注意以下几点:
- 接口尽量小,但是要有限度。对接口进行细化可以提高程序设计灵活性是不挣的事实,但是如果过小,则会造成接口数量过多,使设计复杂化。所以一定要适度。
- 为依赖接口的类定制服务,只暴露给调用的类它需要的方法,它不需要的方法则隐藏起来。只有专注地为一个模块提供定制服务,才能建立最小的依赖关系。
- 提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。
carp:
PLK
:最小只是原则(迪米特法则):一个对象应该对其他对象保持最少的了解
迪米特法则的初衷是降低类之间的耦合,由于每个类都减少了不必要的依赖,因此的确可以降低耦合关系。但是凡事都有度,虽然可以避免与非直接的类通信,但是要通信,必然会通过一个“中介”来发生联系,例如本例中,总公司就是通过分公司这个“中介”来与分公司的员工发生联系的。过分的使用迪米特原则,会产生大量这样的中介和传递类,导致系统复杂度变大。所以在采用迪米特法则时要反复权衡,既做到结构清晰,又要高内聚低耦合。
相关:
http://baike.baidu.com/link?url=GwXOHQXmGYdyDNhjajXYAFPPsJ8j-gktxXALpPFi0vPZe4Kfai4VjIOug-lQd6kn7N0N
客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。