`

《设计模式》之一:六大设计原则

阅读更多

第1原则:单一职责原则

单一职责原则的定义是:应该有且仅有一个原因引起类的变更。

这个原则判别起来最难的地方就是对于职责的定义,以及怎样去划分职责。

 

为了方便理解,举个一个简单的电话接口例子,普通人都会这样写:

public interface IPhone {
	// 拨通电话
	public void dial(String number);
	// 通话
	public void chat(Object o);
	// 通话完毕,挂电话
	public void hangup();
}

 初看上去没啥问题,但是它包含了两个职责:一个是协议管理,一个是数据传送。dial()和hangup()两个方法实现的是协议管理,分别负责拨号联通和挂机;chat()实现的数据的传送,把我们说的话转换成模拟信号或数字信号传递给对方,然后将对方传递过来的信号还原成我们听得懂的语言。

我们可以这样考虑,协议接通的变化会引起这个接口或实现类的变化吗?当然会的啦,那数据传送(比如电话不仅可以通话,还可以上网)的变化会引起这个接口或实现类的变化吗?当然也是会的啦。那么就有两个原因引起了这个类的变化,也就是违反了单一职责的设计原则了。

再进一步分析,这两个职责会相互影响吗?不会影响。

 

单一职责适用于接口、类、同时也适用于方法。就是一个方法尽可能做一件事。

 

最佳实践:在实际项目中,如果严格按照单一职责原则来设计系统,那么会带来过度耦合,类的数量过多,过度人为的设计了。

 

对于单一职责原则,最佳建议就是接口一定要做到单一职责,类的设计尽量做到只有一个原因会引起这个类的改变, 就可以了。

 

第2原则:里氏替换原则

大家都知道Java中继承带来的好处,大概也清楚带来的一些耦合性的坏处吧。所以,组合优于继承

究竟什么时候最适合用继承呢?里氏替换定义是:所有引用基类的地方必须能透明地使用其子类的对象。

包含四层含义:

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

注意:如果子类不能完整实现父类方法,或者父类的某些方法在子类中已经发生畸变,则建议断开父子继承关系,采用依赖、聚集、组合等关系代替继承。

2,子类可以由自己的个性

也就是说上面的反过来就不一定成立了,有子类出现的地方父类未必就可以出现

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

比如父类的一个方法  do(HashMap map) ,子类中定义 do(Map map),这个就是重载overload,而不是override。那么无论是用Map引用或者HashMap引起去调用子类的方法,都只会执行父类方法,子类的参数可以运行范围扩大了,但是只要是父类出现的地方,就可以替换成子类这个原则使然,执行结果不变。

所以子类中方法的前置条件必须与超类中被覆写的方法的前置条件相同或者更宽松。

4,赋写或实现父类的方法时输出结果可以被缩小

 

第3原则:依赖倒置原则

三层含义:

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

2,抽象不应该依赖细节

3,细节应该依赖抽象

更为精确一点就是面向接口编程 ---OOD Object-Oriented Design 面向对象编程的精髓之一。

采用依赖倒置原则可以减少类间的耦合性,提高系统的稳定性,减低并行开发引起的风险,提高代码的可读性和可维护性,最后一点,貌似还可以提高代码的可测性。

被依赖者的变更竟然让依赖者来承担修改的成本,这样的依赖关系谁肯承担,这个设计是极其不稳定的。

最佳实践:

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

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

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

4,尽量不要覆写基类方法

5,结合里氏替换原则使用

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

 

第4原则:接口隔离原则

 1,客户端不应该依赖它不需要的接口

2,类间的依赖关系应该建立在最小的接口上

总之就是要将接口细化,保证其纯洁性

接口隔离跟单一职责原则是不同的,单一职责原则是从业务逻辑上划分的,要求类和接口职责单一,注重的是职责,而接口隔离原则要求接口方法尽量少。

根据接口隔离原则拆分接口时,首先必须满足单一职责原则。

最佳实践:

1,通过业务逻辑压缩接口中的public方法,接口时常去回顾,尽量让接口达到满身筋骨肉

2,已经被污染了的接口,要大胆的去修改,如果变更的风险大,则采用适配器模式进行转化处理

 

第5原则:迪米特法则 Law of Demeter

也称为最小知识原则:一个对象应该对其他对象有最少的了解,别人的私事,你知道的越少越好。

出现在成员变量、方法的输入输出参数中的类称为成员朋友类,而出现在方法体内部的类不属于朋友类,迪米特法则告诉我们,一个类只应该与成员朋友类交流,而不应该在方法体内部再去依赖其他的非朋友类。

 

第6原则:开闭原则

一个软件实体如类、模块、函数应该对扩展开放,对修改关闭

其含义是说,一个软件实体应该通过扩展来实现变化,而不是通过修改已有的代码来实现变化。

当业务需求变更时,尽量修改高层次模块,防止底层模块的修改。

 

本人博客已搬家,新地址为:http://yidao620c.github.io/

分享到:
评论

相关推荐

    设计模式六大原则

    设计模式六大原则(2):里氏替换原则 定义:子类型必须能够替换它们的基类型而不影响程序的正确性。这意味着子类对象可以在任何基类被期望出现的地方进行替换,而不会导致程序行为的改变。 问题由来:在使用继承时...

    设计模式之六大设计原则

    设计模式(Design pattern)是一套被反复使用、多数人知知道的、经过分类编目的、代码设计经验的总结。使用设计模式的目的是为了提高代码的可重用性、保证代码的可靠性、让代码更加规范、...二 设计模式之六大设计原则

    24种设计模式介绍与6大设计原则

    二、设计模式的六大原则 1、开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序...

    设计模式六大原则.doc

    设计模式六大原则是软件开发中不可或缺的指导方针,它们旨在提升代码的可维护性、可扩展性和可重用性。以下是对这些原则的详细解释: 1. 单一职责原则(Single Responsibility Principle, SRP): 这个原则强调一个...

    Java设计模式之禅

    书中首先介绍了设计模式的相关概念和六大设计原则,这些原则包括单一职责原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特法则和开闭原则。这些原则是设计模式的基础,它们有助于提高代码的可维护性和可扩展...

    设计模式与设计原则.pdf

    接下来,文件中也提到了六大设计原则: 1. 单一职责原则(Single Responsibility Principle, SRP):一个类应该只有一个引起它变化的原因。这意味着一个类应该只有一个职责或功能。 2. 里氏替换原则(Liskov ...

    设计模式之六大原则

    ### 设计模式之六大原则详解 #### 一、单一职责原则 (SRP) **定义**: 单一职责原则(SRP, Single Responsibility Principle)指出,一个类应该仅有一个引起它变化的原因,换句话说,一个类只应负责一项职责。 **...

    Java和Android源码设计模式

    设计模式六大原则为开发者提供了一套准则,指导他们如何编写高质量的代码: - **单一职责原则**:一个类应该只有一个引起它变化的原因。这意味着每个类应当专注于完成一项功能,避免承担过多的责任。 - **里氏替换...

    JAVA设计模式-设计模式公司出品

    此外,书中还提到了“六大设计原则”,这是设计模式背后的指导思想,包括: 1. 单一职责原则:一个类应该只有一个引起它变化的原因。 2. 里氏替换原则:所有引用基类的地方必须能透明地使用其子类的对象。 3. ...

    一故事一设计模式-LieBrother(完整版).pdf

    **一、六大设计原则** 1. **单一职责原则(SRP)**:该原则主张每个类应该只有一个引起变化的原因,也就是每个类只做一件事。比如,如果一个类既负责用户信息的更新又负责权限的控制,那么应该将这两项职责分开,...

    java 设计模式试题

    题目中的第一个选项“同一问题的不同表现形式”(A) 描述了设计模式的主要应用场景之一。设计模式帮助开发者处理常见的软件设计难题,确保代码的可读性、可维护性和可扩展性。 ### 2. 面向对象的基本原则 面向对象...

    Java和Android设计模式

    设计模式是软件工程师必须掌握的核心技能之一。通过学习和实践各种设计模式,开发者不仅能提高编码效率,还能写出更加优雅、高效的代码。对于Java和Android开发者而言,熟练掌握这些模式对于提升个人技术水平和职业...

    设计模式解析(英文版).pdf

    设计模式之所以能够被广泛接受和应用,关键在于它们遵循了一系列基本原则和动机。这些原则和动机包括但不限于: 1. **封装行为**:设计模式强调封装不仅限于数据,更重要的是封装行为。这意味着将行为和数据紧密...

    设计模式学习知识点总结

    - **简单工厂**:虽然不属于23种标准设计模式之一,但它是一种实用的创建对象的方式。 - **工厂方法模式**:定义创建对象的接口,但由子类决定实例化哪个类。这种模式使得类的实例化被推迟到子类中实现。 - **抽象...

    设计模式特点

    ### 设计模式特点 #### 工厂方法模式 **定义:** 工厂方法模式定义了一个用于创建对象的接口,但让子类决定实例化哪个具体的类。这种方法把实例化的任务推迟到子类中。 **好处:** 1. **良好的封装性**:工厂方法...

Global site tag (gtag.js) - Google Analytics