您的位置:首页 > 其它

设计模式中的6大设计原则

2016-01-02 00:00 162 查看

1.里氏替换原则

Java使用extends关键字来实现继承,采用单一继承的规则。这里会涉及到里氏替换原则。定义:

第一种定义:如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有对象O1都替换成o2时,程序p的行为没有发生变化,那么类型s是类型t的子类型。

第二种定义:所有引用基类的地方必须透明地使用其子类的对象。

通俗点讲,只要父类能出现的地方子类就可以出现,而且替换为子类不会产生任何错误和异常,使用者不需要知道是父类还是子类。反过来说就不行,有子类出现的地方,父类未必就能适应。

里氏替换原则为良好的继承定义了一个规范,包含了4层含义。

子类必须完全实现父类的方法。

子类可以有自己的个性。

覆盖或者实现父类的方法时输入参数可以被放大。子类中方法的前置条件必须与超类中被覆写的前置条件相同或者更宽松。

覆写或者实现父类的方法时输出结果可以被缩小。
父类的方法返回值是一个类型T,子类的相同方法(重载或覆写)的返回值为S,根据里氏替换原则S必须小于T,也就是说S和t是同一个类型,要么s是t的子类。

2.依赖倒置原则

依赖倒置原则包含三层意义:

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

抽象不应该依赖细节。

细节应该依赖抽象。

低层模块:不可分割的原子逻辑,抽象:就是接口或抽象类,细节就是实现类。

在java中的体现:

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

接口或抽象不依赖于实现类。

实现类依赖接口或实现类。

更加精简的意义就是“面向接口编程”。

依赖的三种方法:构造函数传递依赖对象,setter方法传递依赖对象,接口声明依赖对象。

依赖倒置原则本质:通过抽象(接口或者抽象类)使各个类或者模块的实现彼此独立。遵循以下几个原则:

每个类尽量都有接口或者抽象类,或者抽象类或接口两者都具备。

尽量不要覆写基类的方法。

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

3.接口隔离原则

接口分为两种:实例接口:声明一个类,然后用new关键字产生一个实例。

类接口:interface关键字。

定义:建立单一接口,不要建立臃肿庞大的接口,通俗一点讲:接口尽量细化,同时接口的方法尽量少。

接口隔离原则是对接口进行规范约束,包含以下含义:

接口要尽量小。根据接口隔离原则拆分接口的场合,必须满足单一职责。可以从业务角度审视接口的原子性。

接口要高内聚。要求再接口中尽量少公布public方法,接口是对外承诺。

定制服务。系统间相互访问的接口,设计时需要为访问者定制服务:单独为一个个提供优良的服务,一个要求:只提供访问者需要的接口。

接口设计的粒度越小,系统越灵活,但是灵活的同时带来了结果的复杂化,开发难度的增加,可维护的降低,接口的设计一定要注意适度。

在实践中可以按照以下几个原则衡量:

一个接口只服务于一个子模块或者业务逻辑。

通过业务逻辑压缩接口的中的public方法。

根据经验和常识决定接口的粒度大小,接口粒度太小,接口数量剧增,接口粒度太大,灵活性降低,无法提供定制服务。

4.迪米特法则

迪米特法则:最少知识原则,一个对象应该对其他对象最少了解。

一个类公开的public方法越多,修改时涉及到的面也就越大,变更引起的风险扩散也就越大。设计时反复衡量:是否可以在减少public方法和属性,是否可以修改为private,package-private,protected等访问权限,是否可以加上finanl关键字等。

迪米特法则的核心观念就是类间解耦,弱耦合。其要求的结果就是产生了大量的中转或跳转类,导致系统的复杂性提高,同时带来了难度。

5.开闭原则

开闭原则:一个软件实体应该通过扩展来实现变化,而不是通过修改已有的代码来实现变化。

6.单一职能原则

接口尽量做到单一职责,类的设计做到只有一个原因引起变化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: