单一职责原则
2015年12月19日 星期六
15:35
1、Single Responsibility Principle
简称SRP
2、定义:
应该有且仅有一个原因引起类的变更。
3、单一职责的好处:
1、类的复杂性降低
2、可读性提高
3、可维护性提高
4、变更引起的风险降低
4、难点
职责的划分
5、适用范围
1、接口
2、类
3、方法
里氏替换原则
2015年12月19日 星期六
15:42
1、Liskov 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属性和方法,并且声明与其他对象的依赖关系,抽象类负责公共构造的实现,实现类准确的实现业务逻 辑,同时在适当的时候对父类进行细化