单一职责原则: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. [BZOJ3874][AHOI2014] 宅男计划
  2. 大数据每日干货第四天(linux基础之一目录结构与常用命令)
  3. spring 自动扫描、注册的类是否可以定义构造函数
  4. Android调用系统自带的设置界面
  5. AppScan Source V8.8 中弃用的功能
  6. 【leetcode】Longest Consecutive Sequence
  7. delphi 连接MYSQL 的方法
  8. (转)log4j:WARN No appenders could be found for logger 解决方案
  9. JQuery实现回车代替Tab键(按回车跳到下一栏)
  10. 从源码角度深入理解LayoutInflater
  11. CONCATENATION 引发的性能问题
  12. mysql 中的数据类型
  13. JS 事件对象和事件冒泡
  14. tangible T4 Editor 2.2.3 plus modeling tools for VS 2012 扩展名
  15. CMD下用csc.exe编译.cs 代码
  16. [笔记]LR和SVM的相同和不同
  17. WPF 简易的跑马灯效果
  18. macbook air扩展显示器全屏滑动怎样不一起滑动?
  19. Django【部署】uwsgi+nginx
  20. python面向对象学习(二)基本语法

热门文章

  1. BNUOJ 3580 Oulipo
  2. pytorch中torch.unsqueeze()函数与np.expand_dims()
  3. [android 代码search地址]
  4. 02-JSON
  5. 刷题总结——road(ssoi)
  6. 服务器内部转发forward,action到action
  7. uva 10515 规律打表
  8. spring 容器bean
  9. Codeforces Round #288 (Div. 2) E. Arthur and Brackets [dp 贪心]
  10. 【nodejs原理&源码赏析(3)】欣赏手术级的原型链加工艺术