单一职责原则:Single Responsibility Principle (SRP)

一个类。仅仅有一个引起它变化的原因。应该仅仅有一个职责。每个职责都是变化的一个轴线。假设一个类有一个以上的职责,这些职责就耦合在了一起。这会导致脆弱的设计。当一个职责发生变化时,可能会影响其他的职责。另外,多个职责耦合在一起,会影响复用性。

比如:要实现逻辑和界面的分离。

T负责两个不同的职责:职责P1。职责P2。当因为职责P1需求发生改变而须要改动类T时。有可能会导致原本执行正常的职责P2功能发生问题。

也就是说职责P1和P2被耦合在了一起。

原因是职责扩散:由于某种原因,某一职责被分化为颗粒度更细的多个职责了。


比如Iphone接口,打电话分为四个过程,拨号。通话,回拨。挂机。

这样子貌似没错。可是细致想一想扩展性和变更,你会发现。假设将来升级,要转化为数字电话,那么通话要又一次写,拨号也是。
这样一来的话。须要一种更好的设计,无论一种方法怎样变化,还有一种无论。这就是职责单一原则。 
思路例如以下: Iphone这个接口有俩个职责,一个是协议管理,一个是传输数据。

一个负责数据传输,无论什么数据,基于什么版本号,而还有一个负责拨号和挂机,拨号仅仅负责能接通即可。

这种优点: 协议管理和数据传送分开,假设将来科技进步。那么就降低了由于变更而引起的工作量。可维护性和可读性提高了。


再来一个样例:  改动信息  

改动后:

里氏替换原则: Liskov Substitution Principle,LSP

继承的优缺点
长处:代码共享。重用性,可扩展性
缺点:减少了代码的灵活性,添加了耦合性(父变子则变)

悟 : 父类就是为了解决子类们基础问题而存在,好比父类就是大地,而子类就是大地上全部植物,父类就攻克了土地,水的问题。

 

1.子类继承父类的成员变量

  当子类继承了某个类之后,便能够使用父类中的成员变量。可是并非全然继承父类的全部成员变量。详细的原则例如以下:

  1)可以继承父类的public和protected成员变量;不可以继承父类的private成员变量;

  2)对于父类的包訪问权限成员变量,假设子类和父类在同一个包下。则子类可以继承;否则。子类不可以继承。

  3)对于子类能够继承的父类成员变量,假设在子类中出现了同名称的成员变量,则会发生隐藏现象,即子类的成员变量会屏蔽掉父类的同名成员变量。假设要在子类中訪问父类中同名成员变量,须要使用superkeyword来进行引用。

  2.子类继承父类的方法

  相同地,子类也并非全然继承父类的全部方法。

  1)可以继承父类的public和protected成员方法。不可以继承父类的private成员方法;

  2)对于父类的包訪问权限成员方法,假设子类和父类在同一个包下,则子类可以继承。否则,子类不可以继承。

  3)对于子类能够继承的父类成员方法。假设在子类中出现了同名称的成员方法,则称为覆盖。即子类的成员方法会覆盖掉父类的同名成员方法。

假设要在子类中訪问父类中同名成员方法,须要使用superkeyword来进行引用。

  注意:隐藏和覆盖是不同的。隐藏是针对成员变量和静态方法的,而覆盖是针对普通方法的。(后面会讲到)

  3.构造器

  子类是不可以继承父类的构造器,可是要注意的是。假设父类的构造器都是带有參数的,则必须在子类的构造器中显示地通过superkeyword调用父类的构造器并配以适当的參数列表。假设父类有无參构造器,则在子类的构造器中用superkeyword调用父类构造器不是必须的,假设没有使用superkeyword,系统会自己主动调用父类的无參构造器。



   原则1:子类必须全然实现父类的方法
        就如上面所说的,假如大地的子类玉兔,这个东西既不须要土地和水,却继承了大地,那么这是不合理的。

子类必须全然实现父类的方法就是为了代码复用。

       
    
   原则2:子类能够有自己的个性
        在子类出现的地方。父类未必能够胜任。
        子类在继承的同一时候能够扩展出其它方法和属性。万物生长,基于大地。

    
   原则3:覆盖式实现父类的方法时输入參数可被放大
        首先理解重写和重载的差别: 
                重载:方法名同样,參数不同。

                重写:方法名同样。參数同样。

分析:覆盖式实现父类方法事实上就是重载,假设子类中输入參数被放大,那么父类那部分代码就没有浪费,这句话说的非常晦涩。的确刚刚学的时候想了好久。后来再看了一下原则就释然了,代码重用!

每一个方法必须有所用处,父类中的參数范围尽管没有子类的大。子类的重载是为了扩展。弥补了父类的不足。一般来说,是不会去重载的。

假设反过来。假设子类的參数范围比父类要小,相当于子类方法中有俩个方法,一个是父类的方法,一个是子类的,父类參数范围大,子类范围小。有父类的地方子类却不能使用,这个已经违背了原则。


悟 : 重载就是将父类的类名称改为子类名,再加一个方法名同样。參数不同的方法。
      重写就是将父类的类名称改为自类名,再改动一下被重写的方法。

样例: 
Father 类
public class Father {
public Collection doSomething(Map map){
System.out.println("父类:Map 转集合");
return map.values();
}
}

Son 类

public class Son extends Father {
public Collection doSomething(HashMap map) {
System.out.println("子类:Hashmap 转集合");
return map.values();
}
}

測试类

public static void main(String[] args) {
Son f=new Son(); //俩个方法 一个
HashMap h=new HashMap();
f.doSomething(h); //子类
}

结果:

子类:Hashmap
转集合

參考书籍:

《设计模式之禅》

參考文章:

我是菜鸟,我在路上。

面向对象五大原则_1.单一职责原则&2.里氏替换原则的更多相关文章

  1. C# 实例解释面向对象编程中的里氏替换原则

    在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解.灵活和可维护.这些原则是由美国软件工程师和讲师罗伯特·C·马丁(Robert Cecil Martin)提出的许多原 ...

  2. S.O.L.I.D五大原则之单一职责SRP

    转自 : 汤姆大叔的blog Bob大叔提出并发扬了S.O.L.I.D五大原则,用来更好地进行面向对象编程,五大原则分别是: The Single Responsibility Principle(单 ...

  3. 深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP

    前言 Bob大叔提出并发扬了S.O.L.I.D五大原则,用来更好地进行面向对象编程,五大原则分别是: The Single Responsibility Principle(单一职责SRP) The ...

  4. 开放-封闭原则(OCP)开-闭原则 和 依赖倒转原则,单一职责原则

    单一职责原则 1.单一职责原则(SRP),就一个类而言,应该仅有一个引起它变化的原因 2.如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会消弱或抑制这个类完成其他职责的能力. ...

  5. java6大原则之单一职责原则,里式替换原则

    单一职责原则:一个接口,一个类,一个方法,最好只做一类事,当然,在真实的项目中,一系列因素下,很难做到单一职责原则,但是针对接口是可以做到的,方法和类要尽量做到 里式替换原则:父类出现的地方,换成子类 ...

  6. 设计原则:单一职责(SRP)原则

    1 什么是单一职责(SRP)原则 单一职责原则的英文是 Single Responsibility Principle,缩写为 SRP.翻译过来就是:一个类或者模块只负责完成一个职责(或者功能). 所 ...

  7. 深入理解JavaScript系列(8):S.O.L.I.D五大原则之里氏替换原则LSP

    前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第3篇,里氏替换原则LSP(The Liskov Substitution Principle ). 英文原文:http ...

  8. 第2章 面向对象的设计原则(SOLID):2_里氏替换原则(LSP)

    2. 里氏替换原则(Liskov Substitution Principle,LSP) 2.1 定义 (1)所有使用基类的地方必须能透明地使用子类替换,而程序的行为没有任何变化(不会产生运行结果错误 ...

  9. 【面向对象设计原则】之里氏替换原则(LSP)

    里氏代换原则由2008年图灵奖得主.美国第一位计算机科学女博士Barbara Liskov教授和卡内基·梅隆大学Jeannette Wing 教授于1994年提出,所以使用的是这位女博士的性命名的一个 ...

随机推荐

  1. idea 无法创建Scala class 选项解决办法汇总

    原因一:没有添加scala sdk 解决:file=>project structure =>Global Libraries,添加scala-sdk: 没有scala sdk的可以去网上 ...

  2. python接口自动化测试二十七:密码MD5加密

    # MD5加密 # 由于MD5模块在python3中被移除# 在python3中使用hashlib模块进行md5操作import hashlib def MD5(str): # 创建md5对象 hl ...

  3. layer2-1 二层

    一   概述    一层的相关介绍 CSMA/CD 网桥和交换机的区别 冲突    共享      端口密度     性能   功能   交换机的三种主流转发方式 存储转发         完整的收到 ...

  4. Laya Timer原理 & 源码解析

    Laya Timer原理 & 源码解析 @author ixenos 2019-03-18 16:26:38 一.原理 1.将所有Handler注册到池中 1.普通Handler在handle ...

  5. Working out (DP)

    Summer is coming! It's time for Iahub and Iahubina to work out, as they both want to look hot at the ...

  6. 【java基础 10】hash算法冲突解决方法

    导读:今天看了java里面关于hashmap的相关源码(看了java6和java7),尤其是resize.transfer.put.get这几个方法,突然明白了,为什么我之前考数据结构死活考不过,就差 ...

  7. ER模型图工具:PowerDesigner

    导读:开始是想一个阶段一个阶段的写文档,再写了可行性分析报告之后,发现这种方法整体性不强,写出来的文档也总是有考虑不周的地方.后来,就看完了全部的软工视频再写.现在该写项目开发总结报告了.在写文档的过 ...

  8. POJ3630/HDU-1671 Phone List,字典树静态建树!

    Phone List POJ动态建树TLE了~~~ 题意:拨打某个电话时可能会因为和其他电话号码的前几位重复而导致错误,现在给出一张电话单,求是否有某个电话是其他电话的前缀.是则输出NO,否则输出YE ...

  9. 九度oj 1547

    题目描述: 给定一个初始为空的栈,和n个操作组成的操作序列,每个操作只可能是出栈或者入栈. 要求在操作序列的执行过程中不会出现非法的操作,即不会在空栈时执行出栈操作,同时保证当操作序列完成后,栈恰好为 ...

  10. Spring JdbcTemplate 查询方法中的RowMapper实现汇总

    实现一.在内部建立内联类实现RowMapper接口 package hysteria.contact.dao.impl; import java.sql.ResultSet; import java. ...