设计模式的七大原则

单一职责原则

用于控制类的粒度,就是一个类只做一件事。从编码方面一个类的职责越多,该类修改越频繁更不用谈复用并且类之间的耦合高。单一职责原则并不是让类的职责变少,而是在保证类的低耦合的情况下实现高内聚。例如,在做一个图形化数学应用时不符合单一职责原则的类如下:

class Rectangle{
    public int perimeter(){}//周长
    public int area(){}//面积
    public void draw(){}//画线
    public void full(){}//填色
}

因为画线、填色是GUI需要负责的,而不属于长方形的职责范围所以需要将这两个方法独立出来作为一个工具类来使用。

开放-封闭原则

对扩展开放,对修改关闭。就是对原来的类尽量少甚至不作修改,达到功能的扩展。这就需要通过一个接口类来实现了,原理就是封闭变化。例如拿手开门:

class Hand{
    public void do(OldDoor door){
        if(door.open){
            door.open=false;//懒得写set、get,不要模仿
        }else{
            door.open=true;
        }
    }
}
class OldDoor{
    public boolean open=false;
}

现在要开一个NewDoor:

class NewDoor{
    public boolean open=false;
}

此时hand的do方法就要修改源码,这就不符合“封闭"。此时需要加入一个接口来封闭变化。

public interface Action{
    public void toggle();
}
class Hand{
    private Action action=new Action();
    public void do(){
        action.toggle();
    }
}
class NewDoor implements Action{
    public boolean open=false;
    public void toggle(){
        if(this.open){
            this.open=false;
        }else{
            this.open=true;
        }
    }
}

现在所有的门只需要实现了这个接口那么都能正常使用,并且符合对修改封闭,对扩展开放了。

里氏替换原则

用子类替换父类不会对程序的正确性造成影响。这就意味着子类的方法不会对父类有影响,同时父类不会有子类难以继承的方法或成员。例如

class Quadrangle{
    private int width;
    private int length;
    public int getWidth(){}
    public int getLength(){}
}
class Square extends Quadrangle{public boolean test(int w,int l){}}
//正方形没有宽高只有边长,并且要求父类宽高一直需要加上约束
class Rectangle extends Quadrangle{}//正常

此时,就需要父类尽量减少会受到约束的成员变量与方法,甚至成为一个接口子类完全实现父类方法

class Quadrangle{
    public int getWidth(){}
    public int getLength(){}
}
class Square extends Quadrangle{
    private int side;//边长
    public int getSide(){}
}
class Rectangle extends Quadrangle{
    private int width;
    private int length;
}

依赖倒置原则

传统的,由高层模块调用底层模块的方法。这样当底层模块方法变化高层也需要修改。依赖倒置原则就规定高层模块定义接口底层模块依赖于抽象(中间层/接口)。这样高层不依赖于底层的接口而依赖于抽象(中间层/接口)。例如

class Client{
    public void do(Server server){}
}
abstract class Server{
    public abstract void service(){}
}
class Waiter extends Server{
    @Override
    public void service(){}
}

接口隔离原则

一个接口干一件事,避免肥接口。一个接口好比一个演员,你不能让一个演员分饰多角(人格分裂当我没说)。

比如一个销售系统,分为门户(查询)、前台(下单)、后台(出货)。那么肥接口如下:

public Order(Something something){
    if(query){
        //查询
    }else if(insert){
        //下单
    }else{
        //出货
    }
}

正常情况应该把if中的判断分为几个接口。

合成复用原则

通常类的复用分为继承复用和合成复用两种。继承有它的优点但是存在如下问题:

  • 破坏了类的封装性。因为继承会将父类的实现细节暴露给子类,父类对子类是透明的,所以这种复用又称为“白箱”复用。
  • 子类与父类的耦合度高。父类的实现的任何改变都会导致子类的实现发生变化,这不利于类的扩展与维护。
  • 它限制了复用的灵活性。从父类继承而来的实现是静态的,在编译时已经定义,所以在运行时不可能发生变化

组合的优点如下:

  • 它维持了类的封装性。因为成分对象的内部细节是新对象看不见的,所以这种复用又称为“黑箱”复用。
  • 新旧类之间的耦合度低。这种复用所需的依赖较少,新对象存取成分对象的唯一方法是通过成分对象的接口。
  • 复用的灵活性高。这种复用可以在运行时动态进行,新对象可以动态地引用与成分对象类型相同的对象。

总结就是继承耦合高。继承像妻子,离婚手续多,组合像情妇,下一个更乖。

think in java也说虽然处处强调继承,但是应该先考虑用组合。

迪米特法则

类应该与尽量少的类进行交互,降低耦合。也叫知识最少原则

  • 只和必须直接调用的类交流
  • 和类的交流尽量少,比如A需要调用B类的1、2、3方法应该把三个方法封装为一个供A调用
  • 一个类公开的public属性或方法越多,修改时涉及的面也就越大,变更引起的风险扩散也就越大。所以,我们开发中尽量不要对外公布太多public方法和非静态的public变量,属性或方法尽量内敛
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352