单一职责原则: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. 大数据学习——hbase数据库

    Hhbase集群搭建 一 第一步 准备:搭建hadoop集群,搭建zookeeper 二 第二步:上传安装包 解压 1 tar -zxvf  hbase-1.2.1-bin.tar.gz 重命名 2 ...

  2. Java异常架构图及面试题---https://www.cnblogs.com/gaoweixiao99/p/4905860.html

    https://www.cnblogs.com/gaoweixiao99/p/4905860.html 红色为检查异常,就是eclipse要提示你是try catch 还是throws. 非检查异常, ...

  3. 脑阔疼的双层SQLserver游标

    本来简单的双层游标没啥的,内层游标需要读取的是视图的内容,一直报“当前命令发生了严重错误.应放弃任何可能产生的结果.”的错误.无可奈何尝试先将视图的数据放到表变量中,之后再用游标遍历表变量. 简直很怀 ...

  4. 菜鸡的2017CPPC网络赛

    Friend-Graph Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  5. [BZOJ3611] [Heoi2014]大工程(DP + 虚树)

    传送门 $dp[i][0]$表示节点i到子树中的所有点的距离之和 $dp[i][1]$表示节点i到子树中最近距离的点的距离 $dp[i][2]$表示节点i到子树中最远距离的点的距离 建好虚树后dp即可 ...

  6. [BZOJ1594] [Usaco2008 Jan]猜数游戏(二分 + 并查集)

    传送门 题中重要信息,每堆草的数量都不一样. 可以思考一下,什么情况下才会出现矛盾. 1.如果两个区间的最小值一样,但是这两个区间没有交集,那么就出现矛盾. 2.如果两个区间的最小值一样,并且这两个区 ...

  7. 刷题总结——spoj1812(后缀自动机+DP)

    题目: A string is finite sequence of characters over a non-empty finite set Σ. In this problem, Σ is t ...

  8. 【kmp或扩展kmp】HDU 6153 A Secret

    acm.hdu.edu.cn/showproblem.php?pid=6153 [题意] 给定字符串A和B,求B的所有后缀在A中出现次数与其长度的乘积之和 A和B的长度最大为1e6 方法一:扩展kmp ...

  9. msp430入门学习41

    msp430的其他九 msp430入门学习

  10. WEB学习-HTML的骨架

    HTML的标准骨架 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...