设计模式六大原则

单一职责原则

不要存在多于一个导致类变更的原因,如果一个类承担的责任过多,就等于把这些责任的风险也承担了过来。

一开始只是人类,学习是本能

public class Person{
    public void study(){
        
    }
}

接下来分职业

public class Person{
    public void study(String type){
        if("doctor".equals(type)){
            //学医
        }else if("teacher".equals(type)){
            //教育
        }
    }
}

不只是学习,吃饭也很重要

public class Person{
    public void study(String type){
        if("doctor".equals(type)){
            //学医
        }else if("teacher".equals(type)){
            //教育
        }
    }

    public void eat(String type){
        if("doctor".equals(type)){
            //点外卖
        }else if("teacher".equals(type)){
            //食堂吃
        }
    }
}

如果职业多了厨师,助理,行为多了走,玩,休息等呢?这样的话,Person类就会变得很复杂。

为什么会出现这种情况呢?因为类似于吃饭,学习,玩,休息等行为都属于具体个人的行为,应该细分到具体的人身上。而Person这个类的最初的目的是为了定义人类的基本行为。

public class Person{
    public void study(){
        //学习 不关注具体学习行为
    }

    public void walk(){
        
    }   
}

public class Teacher extend Person{
    public void study(){
        //教育
    }
}

这样一划分的话,Person类 就只需要关注有什么行为,具体什么行为划分到具体的人上。

开放封闭原则

对于拓展是开放的, 对于更改是封闭的。

简单来说就是原来的一些定义类型的代码(诸如接口,实体类,抽象类等)不要改了,要想加功能,就往上加,改代码是不行的。因为你根本不知道你的改动会造成什么不可预期的变化。

有这么一个需求设置时钟的时间

public class Clock{
    public void setClock(int hour){
        
    }   
}

这时需求改动,需要设置分针,这时不应该修改代码中的 setClock(int hour)函数,因为你并不知道有多少的地方调用它,而是增加一个函数setClock(int hour,int minute)

public class Clock{
    public void setClock(int hour){
        
    }   
    
    public void setClock(int hour,int minute){
        
    }
}

里氏替换原则

定义一:子类对象能够替换父类对象,而程序逻辑不变。

定义二:子类可以扩展父类的功能,但不能改变基类原有的功能。

疑问:里氏替换原则中提到不能修改基类的方法,而多态的条件却是要求子类重写基类的方法,多态是不是违背了里氏替换原则。

不管是里氏替换原则还是多态都依赖继承。这时你得分清楚,继承的目的是什么?

继承是为了代码复用,共享方法,这可以说是继承的最大优势。比如

public class Person{
    private void walk(){
        System.out.println("走");
    }
}

public class Teacher extends Person{

}

public class Doctor extends Person{
    
}

以上述的代码为例.

问:人你会干点什么
答:走

问:老师你会干点什么,
答:走

问:医生你会干点什么,
答:走

这样的情景下,老师和医生这两个类不需要额外的工作就能回答会干点什么这个提问。而且把替换成任何一个子类 老师或者医生,结果都不会变。这便符合了里氏替换原则。

继承是为了多态

public class Person{
    public void walk(){
        System.out.println("走");
    }
}

public class Teacher extends Person{
    public void walk(){
        System.out.println("慢慢走");
    }
}

public class Doctor extends Person{
    public void walk(){
        System.out.println("走的很快");
    }
}

问:人你会干点什么
答:走

问:老师你会干点什么,
答:慢慢走

问:医生你会干点什么,
答:走的很快

这种场景下,用子类老师或者医生来替换基类人就会发生歧义,你刚才说的是?现在怎么就变慢慢走了?这样情况就不符合里氏替换原则了。

如果是这种情况,正确的写法应该是

public abstract class Person{
    public abstract void walk();
}

public class Teacher extends Person{
    public void walk(){
        System.out.println("慢慢走");
    }
}

public class Doctor extends Person{
    public void walk(){
        System.out.println("走的很快");
    }
}

问:人你会干点什么?什么,你不在? (抽象类,无法生成对象)

问:老师你会干点什么,
答:慢慢走

问:医生你会干点什么,
答:走的很快

因为基类是抽象类,无法生成对象,所以并不会违背里氏替换原则,从某种程度上来说,不违背原则,那就是遵循了里氏替换原则。

定义一:子类对象能够替换父类对象,而程序逻辑不变。

回到开头的问题,多态是不是违背了里氏替换原则?回答,不是。

总的来说,想省事就不要想着修改基类。想个性那就定义抽象基类。

依赖倒置原则

高层模块不应该依赖具体底层模块,两个都应该依赖接口。简单的说就是面向接口编程,而不是面向具体实现。
任何变量都不应该持有一个指向具体类的指针或引用。

实际上就是面向接口编程,主要思想跟上述里氏替换原则有点类似。只不过里氏替换原则重点放在继承上,而依赖倒置原则则是放在接口上,好处呢?java中单继承,多实现。

接口分离原则

客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。
接口应该是内聚的,应该避免“胖”接口。一个类对另外一个类的依赖应该建立在最小的接口上,不要强迫依赖不用的方法,这是一种接口污染。

public interface Teacher {
    public void teachMath();

    public void teachChinese();
}

public class MathTeacher implements Teacher{
    public void teachMath() {
        //教数学
    }   

    public void teachChinese() {
        
    }
}

由于数学老师并不会教语文,所以导致teachChinese()这个方法是多余的,这也就造成了接口污染的情况。合适的方式就是接口隔离。

public interface Teacher {
    public void teachMath();
}

public interface Teacher2{
    public void teachChinese();
}

public class MathTeacher implements Teacher{
    public void teachMath() {
        //教数学
    }   
}

假设这个数学老师比较厉害,还会教英语,这时再加一个接口,这个厉害的数学老师实现两个接口,普通的数学老师实现一个接口,比如

public interface Teacher {
    public void teachMath();
}

public interface Teacher2{
    public void teachEnglish();
}

public class GoodMathTeacher implements Teacher,Teacher2{
    public void teachMath() {
        //教数学
    }   
    
    public void teachEnglish() {
        //厉害的数学老师教英语
    }   
}

public class MathTeacher implements Teacher{
    public void teachMath() {
        //普通的数学老师只能教数学
    }   
}

迪米特原则

迪米特法则:一个对象应该对其他对象保持最少的了解

简单来说就是对象与对象之间的关系越简单越好,最后能通过接口,继承,代理等方式关联。

参考文章
参考文章

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,123评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,031评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,723评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,357评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,412评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,760评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,904评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,672评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,118评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,456评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,599评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,264评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,857评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,731评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,956评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,286评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,465评论 2 348

推荐阅读更多精彩内容

  • 设计模式之六大原则(转载) 关于设计模式的六大设计原则的资料网上很多...
    霄霄霄霄阅读 898评论 0 1
  • 设计模式六大原则 设计模式六大原则(1):单一职责原则 定义:不要存在多于一个导致类变更的原因。通俗的说,即一个类...
    viva158阅读 764评论 0 1
  • 设计模式六大原则(1):单一职责原则 定义:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。 ...
    Jabir_Zhang阅读 641评论 0 3
  • 前言 设计模式六大原则网上资料比较多比较乱,本文将网上的一些好的资料做一下整理,以便随时翻阅。友情提示,设计模式虽...
    简单的土豆阅读 1,430评论 0 10
  • 今早高铭玉妈妈给孩子们去送本子,正好一年级新生入学,聊起这个话题,确实就在眼前。两年前,我也是这样在操场迎接...
    皮_小皮阅读 224评论 0 3