设计模式-六大原则

设计模式之禅

在继续看后面的设计模式大pk之前,我需要对前面的知识进行梳理,对比以及形成自己的一套说辞

先来整理一下设计模式的首要的几个原则。一共 六大

一、单一职责原则

一句很牛❌哄哄的英文是这样说的 "There should never be more than one reason for a class to change"

有且仅有一个原因引起类的变更。(这里用到的数学引语也是很伟大,有且仅有!有且仅有,就是只有唯一的一个原因可以引起变化)

举个🌰吧!

现代人喜欢吃饭,睡觉,打豆豆。

class IEat{
    virtual void eat() = 0;
};
class ISleep{
    virtual void sleep() = 0;
};
class IDadd{
    virtual void dadd() = 0;
};

三个接口分别实现吃饭睡觉打豆豆,每个行为都是只有一个变化引起,而且对外公布的是接口,而不是具体的实现类,所以因为具有单一原则,我们可以实现

  • 让类的复杂性降低,而不是让一个类很牛逼。
  • 让可读性提高,而不是天书一样
  • 可维护性提高,而不是没有spanner,都不能修。
  • 变更引起的风险低,变的是单一接口,所以,不会有连锁反应。

    人生有多少个十年,这个十年,就做一件事情。

    所以,在写程序的时候,多考虑一下,让一个类或者一个方法只做一件事情。

二、里氏替换原则(我是一个有原则的类)

is-a

定义:所有引用基类的地方必须能透明地使用其子类的对象。

爸爸在你就可以在,你在爸爸不可以在(特别是在做羞羞的事情的时候>_<!!!>);青出于蓝而胜于蓝,所以爸爸在的地方,你可以适应,你在的地方,爸爸未必适应。

里氏替换原则四层定义。

  • 子类必须完全实现父类的方法。
  • 子类可以有自己的个性。(仔大仔世界)
  • 覆盖或实现父类的方法时输入参数可以被放大。

    子类中的方法的前置条件必须与超类中被覆写的方法的前置条件相同或者更宽松。
  • 覆写或实现父类的方法时输出结果可以被缩小。

    其实里氏替换原则就是为了增强程序的健壮性的,传递不同的子类实现不同的方法。

    所以重载的时候,应该让子类的参数更加宽松。

    一言毙之日:扑朔迷离!

三、依赖倒置原则

高层模块不应该依赖低层模块,两者都应该依赖其抽象。

抽象不应该依赖细节

细节应该依赖抽象

就是面向接口编程,不要面向细节,不面向业务。

实现类之间不要产生什么直接依赖关系,通过接口或抽象类产生。

接口或抽象类不依赖实现类。

实现类依赖接口或抽象类。

🌈 就是面向对象,面向接口编程!

提高代码的可读性和可维护性。减少类之间的耦合性,提高系统的稳定性,降低并行开发引起的风险,提高代码的可读性和可维护性。

class IDriver{
    void drive(ICar car);
};

class Driver:private IDriver{ // 实现这个方法为主
    void drive(Icar car);
};

class ICar{
    void run();
};

class Benz:private ICar{
    void run();
};
class BWM:private Icar{
    void run();
};

int main(){
    IDriver driver = new Driver();
    Icar benz = new Benz();
    driver.drive(benz); // 传入不同的参数,显式不同的输出
}

测试的时候,直接新建一个接口,就可以测试!简直无敌。

依赖的写法

  • 构造函数传递依赖对象

    这个叫构造函数注入。这个不用多讲,就是构造函数传参传入。
  • setter方法传递依赖对象
class IDriver{
    void setCar(Icar car);
};
class Driver:private IDriver{
    private ICar iicar;
    void setCar(Icar icar){
        this.iicar = icar;
    }
};
  • 接口声明依赖对象

    此上的第二个🌰就是接口声明依赖对象。

    其实依赖倒置,就是通过抽象或接口使各个类或模块的实现彼此独立,不相互影响,实现模块间的松耦合。

    有五个原则需要在项目中守约(守约,今天的长城也很.....)
  • 每个类尽量都有接口或抽象类,或者抽象类和接口两者具备
  • 变量的表面类型尽量是接口或者抽象类。
  • 任何类都不应该从具体类派生(派生抽象类吧)
  • 尽量不要覆写基类的方法。
  • 结合里氏替换原则使用 is-a

四、接口隔离原则(客户端不应该依赖它不需要的接口&类间的依赖关系应该建立在最小的接口上)

建立单一的接口,不要建立臃肿庞大的接口。

接口尽量细化,同时接口中的方法尽量少。

不要和上面的单一混淆了!单一职责就是职责单一,职责!接口隔离原则,就是你的接口方法尽量少。

麻雀虽小,五脏俱全 定义的接口尽量比较小,但是也要涵盖具体的业务。所以,接口小也要满足单一职责的原则。

  • 一般来说,接口一个只服务于一个子模块或业务逻辑
  • 通过业务逻辑压缩public方法,自己内部使用private就好,这样也能实现高内聚(犀利)
  • 了解环境,不要盲从。不是叫你小,你就一定小,接口拆分的标准要按你的业务逻辑来。

五、迪米特法则(最少知识原则) 保持神秘感,知道太多,会惹来杀身之祸的😜!

一个对象应该对其他对象有最少的了解。

一个类应该对自己需要耦合或调用的类知道得最少,你内在跟我没关系,我只需要知道你提供的接口就可以了。

Only talk to your immediate friends

六、开闭原则(对修改关闭,对扩展开放)

尽量扩展以实现变化,而不是修改实现。

class IBook{
    
};
class NoteBook:public IBook{

};
class OffNoteBook:public NoteBook{

};// 只需要扩展 就可以实现不同的变化

对象约束

对于抽象要有约束,尽量不能修改,只是扩展,然后让后面的类继续继承,然后扩展。

  • 通过接口或抽象类约束扩展,对扩展进行边界限定,不允许出现在接口或抽象类中不存在的public方法
  • 参数类型、引用对象尽量使用接口或抽象类,而不是实现类
  • 让抽象层保持稳定,一旦确定即不允许修改
list<IBook> lisBook; // 使用抽象类

元数据控制模块行为

使用数据,就是类似,配置文件,一旦确定基本不用修改。

制定项目章程

约定优于配置

封装变化

  • 将相同的变化封装到一个接口或抽象类中
  • 将不同的变化封装到不同的接口或抽象类中,不应该有两个不同的变化出翔在同一个接口或抽象类中。

    封装可能的变化,具体可以继续查看后面的23个设计模式,怎样封装变化。

    六大原则结合起来SOLLID(solid 稳定)很稳。

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

推荐阅读更多精彩内容

  • 设计模式六大原则 设计模式六大原则(1):单一职责原则 定义:不要存在多于一个导致类变更的原因。通俗的说,即一个类...
    viva158阅读 750评论 0 1
  • 转载标注声明:http://www.uml.org.cn/sjms/201211023.asp 目录:[设计模式六...
    Bloo_m阅读 688评论 0 7
  • 转载自 设计模式六大原则[http://www.uml.org.cn/sjms/201211023.asp#3] ...
    厨子阅读 1,057评论 2 5
  • 设计模式六大原则(1):单一职责原则 定义:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。 ...
    Jabir_Zhang阅读 626评论 0 3
  • 人类直到100年前,大多时间处在缺乏食物状态,所以饮食规矩是有吃的就吃,大多数人还是饥饿。自然界,动物的饮食都是饥...
    YoungTsau阅读 353评论 0 0