http://www.uml.org.cn/sjms/201211023.asp
http://blog.csdn.net/wangjunkg/article/details/3762132
http://blog.csdn.net/bboyfeiyu/article/details/50103471
一、单一职责原则:
就一个类而言,应该只专注于做一件事和仅有一个引起它变化的原因。一个类只负责一项职责。一个类中应该是一组相关性很高的函数、数据的封装。 所谓职责,我们可以理解他为功能,就是设计的这个类功能应该只有一个。因为职责是变化的一个轴线,当需求变化时,该变化会反映类的职责的变化。 使用SRP注意点:
1.可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多;
2.提高类的可读性,提高系统的可维护性;
3.变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响。
4.在代码可控时,各个模块、类、方法...都应该遵循单一职责原则。
二、开闭原则
开放-封闭原则 说明:软件中的对象(类、模块、函数等)应该对于扩展是开放的,但是,对于修改是封闭的。
按照OCP原则设计出来的系统,降低了程序各部分之间的耦合性,其适应性、灵活性、稳定性都比较好。当已有软件系统需要增加新的功能时,不需要对作为系统基础的抽象层进行修改,只需要在原有基础上附加新的模块就能实现所需要添加的功能。增加的新模块对原有的模块完全没有影响或影响很小,这样就无须为原有模块进行重新测试。 在面向对象设计中,不允许更改的是系统的抽象层,而允许扩展的是系统的实现层。换言之,定义一个一劳永逸的抽象设计层,允许尽可能多的行为在实现层被实现。对一个事物抽象化,实质上是在概括归纳总结它的本质。抽象让我们抓住最最重要的东西,从更高一层去思考。这降低了思考的复杂度,我们不用同时考虑那么多的东西。换言之,我们封装了事物的本质,看不到任何细节。 在面向对象编程中,通过抽象类及接口,规定了具体类的特征作为抽象层,相对稳定,不需更改,从而满足“对修改关闭”;而从抽象类导出的具体类可以改变系统的行为,从而满足“对扩展开放”。 对实体进行扩展时,不必改动软件的源代码或者二进制代码。
三、里氏代换原则
当使用继承时,遵循里氏替换原则。类B继承类A时,除添加新的方法完成新增功能P2外,尽量不要重写父类A实现好的方法,也尽量不要重载父类A的方法。子类可以扩展父类的功能,但不能改变父类原有的功能。
说明:子类型必须能够替换它们的基类型。一个软件实体如果使用的是一个基类,那么当把这个基类替换成继承该基类的子类,程序的行为不会发生任何变化。软件实体察觉不出基类对象和子类对象的区别。
优点:可以很容易的实现同一父类下各个子类的互换,而客户端可以毫不察觉。
1.子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
2.子类中可以增加自己特有的方法。
3.当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
4.当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。
四、依赖倒置原则
抽象不应当依赖于细节;细节应当依赖于抽象;要针对接口编程,不针对实现编程。高层模块不应该依赖低层模块,二者都应该依赖其抽象;相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建起来的架构比以细节为基础搭建起来的架构要稳定的多。传递依赖关系:接口传递、造方法传递和setter方法传递.面向接口编程.低层模块尽量都要有抽象类或接口,或者两者都有。变量的声明类型尽量是抽象类或接口。使用继承时遵循里氏替换原则。
五、接口隔离原则
使用多个专一功能的接口比使用一个的总接口总要好。将非常庞大、臃肿的接口拆分成为更小的和更具体的接口.单一职责原则主要是约束类,其次才是接口和方法,它针对的是程序中的实现和细节;而接口隔离原则主要约束接口接口,主要针对抽象,针对程序整体框架的构建。单一职责原则原注重的是职责;而接口隔离原则注重对接口依赖的隔离.
六、迪米特法则
对象与对象之间应该使用尽可能少的方法来关联,避免千丝万缕的关系。只与直接的朋友通信。在类的划分上,应当创建有弱耦合的类。类之间的耦合越弱,就越有利于复用。在类的结构设计上,每一个类都应当尽量降低成员的访问权限。一个类不应当public自己的属性,而应当提供取值和赋值的方法让外界间接访问自己的属性。
http://blog.csdn.net/wangjunkg/article/details/3762132
http://blog.csdn.net/bboyfeiyu/article/details/50103471
一、单一职责原则:
就一个类而言,应该只专注于做一件事和仅有一个引起它变化的原因。一个类只负责一项职责。一个类中应该是一组相关性很高的函数、数据的封装。 所谓职责,我们可以理解他为功能,就是设计的这个类功能应该只有一个。因为职责是变化的一个轴线,当需求变化时,该变化会反映类的职责的变化。 使用SRP注意点:
1.可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多;
2.提高类的可读性,提高系统的可维护性;
3.变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响。
4.在代码可控时,各个模块、类、方法...都应该遵循单一职责原则。
二、开闭原则
开放-封闭原则 说明:软件中的对象(类、模块、函数等)应该对于扩展是开放的,但是,对于修改是封闭的。
按照OCP原则设计出来的系统,降低了程序各部分之间的耦合性,其适应性、灵活性、稳定性都比较好。当已有软件系统需要增加新的功能时,不需要对作为系统基础的抽象层进行修改,只需要在原有基础上附加新的模块就能实现所需要添加的功能。增加的新模块对原有的模块完全没有影响或影响很小,这样就无须为原有模块进行重新测试。 在面向对象设计中,不允许更改的是系统的抽象层,而允许扩展的是系统的实现层。换言之,定义一个一劳永逸的抽象设计层,允许尽可能多的行为在实现层被实现。对一个事物抽象化,实质上是在概括归纳总结它的本质。抽象让我们抓住最最重要的东西,从更高一层去思考。这降低了思考的复杂度,我们不用同时考虑那么多的东西。换言之,我们封装了事物的本质,看不到任何细节。 在面向对象编程中,通过抽象类及接口,规定了具体类的特征作为抽象层,相对稳定,不需更改,从而满足“对修改关闭”;而从抽象类导出的具体类可以改变系统的行为,从而满足“对扩展开放”。 对实体进行扩展时,不必改动软件的源代码或者二进制代码。
三、里氏代换原则
当使用继承时,遵循里氏替换原则。类B继承类A时,除添加新的方法完成新增功能P2外,尽量不要重写父类A实现好的方法,也尽量不要重载父类A的方法。子类可以扩展父类的功能,但不能改变父类原有的功能。
说明:子类型必须能够替换它们的基类型。一个软件实体如果使用的是一个基类,那么当把这个基类替换成继承该基类的子类,程序的行为不会发生任何变化。软件实体察觉不出基类对象和子类对象的区别。
优点:可以很容易的实现同一父类下各个子类的互换,而客户端可以毫不察觉。
1.子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
2.子类中可以增加自己特有的方法。
3.当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
4.当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。
四、依赖倒置原则
抽象不应当依赖于细节;细节应当依赖于抽象;要针对接口编程,不针对实现编程。高层模块不应该依赖低层模块,二者都应该依赖其抽象;相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建起来的架构比以细节为基础搭建起来的架构要稳定的多。传递依赖关系:接口传递、造方法传递和setter方法传递.面向接口编程.低层模块尽量都要有抽象类或接口,或者两者都有。变量的声明类型尽量是抽象类或接口。使用继承时遵循里氏替换原则。
五、接口隔离原则
使用多个专一功能的接口比使用一个的总接口总要好。将非常庞大、臃肿的接口拆分成为更小的和更具体的接口.单一职责原则主要是约束类,其次才是接口和方法,它针对的是程序中的实现和细节;而接口隔离原则主要约束接口接口,主要针对抽象,针对程序整体框架的构建。单一职责原则原注重的是职责;而接口隔离原则注重对接口依赖的隔离.
六、迪米特法则
对象与对象之间应该使用尽可能少的方法来关联,避免千丝万缕的关系。只与直接的朋友通信。在类的划分上,应当创建有弱耦合的类。类之间的耦合越弱,就越有利于复用。在类的结构设计上,每一个类都应当尽量降低成员的访问权限。一个类不应当public自己的属性,而应当提供取值和赋值的方法让外界间接访问自己的属性。