6大设计模式总结__设计模式之禅读书笔记

来源:互联网 发布:python ctypes 详解 编辑:程序博客网 时间:2024/05/29 02:34

单一职责原则

20151219星期六

15:35

1Single Responsibility Principle

简称SRP 

2、定义:

应该有且仅有一个原因引起类的变更。 

3、单一职责的好处:

1、类的复杂性降低

2、可读性提高

3、可维护性提高

4、变更引起的风险降低

4、难点

职责的划分 

5、适用范围

1、接口

2、类

3、方法 



里氏替换原则

20151219星期六

15:42

1Liskov Substitution Principle

简称LSP 

2、定义:

只要父类能出现的地方,子类就可以出现,而且替换成子类也不会产生任何错误或异常,使用者可能根本就不需要知道是父类还是子类,但是反过来不行 

3、规则

1、子类必须完全实现父类的方法,否则就不能继承父类(重写父类的方法)

注意:

在类中调用其他类时务必要使用父类或者接口,否则违背LSP原则

举例:

玩具枪也是枪,但是实现不了真枪杀人的业务,所以不能继承真枪

 

2、子类可以有自己的个性

LSP可以正着用,但是不能反过来用,在子类出现的地方,父类未必能够胜任

举例

(狙击枪)(new步枪());//会报java.lang.ClassCastException的异常,向下转型不安全,父类可能不具有子类特有属性和方法

 

3、覆盖或者实现父类的方法时,输入参数可以被放大

举例

如果Father类的输入参数类型宽于子类的输入参数类型,会出现父类存在的地方,子类未必能够胜任,一旦把子类作为参数传入,调用者就很有可能进入了子类的方法范畴

 

4、覆盖后者实现父类的方法时输出结果可以被缩小

即:

父类的一个方法的返回值是一个类型T,子类的相同方法的返回值是X,那么S <= T

4、优点

1、增强程序的健壮性,版本升级时可以保持非常好的兼容性。即使增加子类,原来的子类还可以运行。

2、在实际的项目中,每个子类对应不同的业务含义,使用父类作为参数,传递不同的子类完成不同的业务逻辑




依赖倒置原则

2015年12月19日 星期六

16:59

1、Dependence Inversion Principle

简称 DIP

 

2、定义

1、高层模块不应该依赖低层模块,两者都应该依赖其抽象

2、抽象不应该依赖细节

3、细节应该依赖抽象

 

本质

通过抽象(接口或者抽象类)使各个类或者模块的实现彼此独立,不相互影响,实现模块间的松耦合。

 

解释:

低层模块

每一个逻辑的实现都是由原子逻辑组成的,不可分割的原子逻辑就是低层模块

高层模块

原子逻辑的再组装

抽象

java中的接口或者抽象类

细节

实现接口或继承抽象类而产生的类

 

在java中的表现

1、模块之间的依赖通过抽象产生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或者抽象类实现的

2、接口或者抽象类不依赖实现类

3、实现类依赖接口或者抽象类

 

更加精简的定义:面向接口编程  OOD  

 

依赖倒置的意思:

依赖正置就是类间的依赖是实实在在的实现类间的依赖,也就是面向实现编程

而编写程序需要的是对现实世界的时候进行抽象,抽象的结果就是有了抽象类和接口,然后我们根据系统设计的需要设计抽 象类和接口间的依赖,代替人们传统思维中的事物的依赖,这就是倒置

3、优点

1、减少类间的耦合、提高系统的稳定性、降低并行开发引起的风险、提高代码的可读性和可维护性

2、项目越大,需求变化的概率就越大,通过采用依赖倒置原则设计的接口或抽象类对实现类进行约束,可以减少需求变化引起的工作量的剧增。如果项目设计优良、代码结构清晰,name人员的变化对项目的影响基本为0.

4、注意

1、抽象是对实现的约束,对依赖者而言,也是一种契约,不仅仅约束自己,还同时约束自己与外部的关系,其目的是保证所有的细节不脱离契约的范畴,确保约束双方按照既定的契约(抽象)共同发展

 

5、依赖的三种写法

1、构造函数传递依赖对象

2、Setter方法传递依赖对象

3、接口声明依赖对象

 

6、遵循规则

1、每个累尽量都要接口或者抽象类,或者抽象类和接口两种都具备

2、变量的表面类型尽量都是接口或者抽象类

3、任何类都不应该从具体类派生

4、尽量不要覆写基类的方法

5、结合LSP原则使用

接口负责定义public属性和方法,并且声明与其他对象的依赖关系,抽象类负责公共构造的实现,实现类准确的实现业务逻辑,同时在适当的时候对父类进行细化






0 0
原创粉丝点击