面向对象设计-开闭原则

一、开闭原则解决的问题

首先不对开闭原则下定义,先看一个不遵循开闭原则的例子。

你自己组装电脑主机,首先购买各种配件,然后按照主机的组成结构拼装在一起,就可以愉快打游戏了。

image.png

有一天,发现显卡带不动一款大型游戏了,所以你想换一块更好的显卡。but,当初买主板和显卡时,它俩的交互接口不是通用的,新买的显卡适配不了主板。

这时,你把主板换了,发现新主板又不适配硬盘了,最后把除了机箱电源之外的组件全部换新的,才升级完显卡。

为了升级显卡(扩展功能),把大部分组件都修改了(对修改不关闭);如果最初组装机器时,各组件的接口都是通用的,那么选择适配接口的显卡即可完成升级。

现在对开闭原则下个定义,开闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开放,对修改关闭。

二、什么是开闭原则

对扩展开放、对修改关闭,这又是开放、又是关闭的,听起来有些矛盾、难以理解,一个东西不可能即开放,又关闭吧?

是的,同一个东西不可能既开放、又关闭! 但是如果不是同一个东西呢?考虑上面装机的故事,多个组件组合在一起,构成了一台完整的主机;但是各组件又是单独的个体,可以对他们进行修改、扩展。既然动词扩展和修改的对象不是同一个,开放、关闭同时存在就成为了可能。

面向对象的世界中也是如此,多个对象通过一定的耦合,形成一个整体对外提供服务。那么什么是对修改关闭,对扩展开放呢?

对修改关闭:参考电脑主机的组成,各个组件之间的耦合,是有一套通用、统一接口,这套依赖关系是不会随着组件的不同而改变的,它是固定的,做到了“对修改关闭”。面向对象中,对修改关闭,意味着对象之间的依赖关系是固定的、不会随着需求变更而修改的。对象之间的依赖架构,是不可修改的,这是对修改关闭。

对扩展开放:世间唯一不变的就是改变,世界要向更好的方向发展。我们的需求是会不断变化的,要想保持进步,必须有可以改变的部分。在组装主机中,各个组件都可以独立升级,主机性能更加完美。面向对象中,对扩展开放,意味着可以在原有的对象组织关系中,轻松增加新特性。

三、实践开闭原则

要做到对修改关闭、构建一个稳固的对象依赖架构,需要高度抽象出对象的本质,依赖本质的抽象而不是具体的对象。因为本质是不会轻易改变的,通过本质依赖构建的结构也不会轻易发生改变。这对软件开发人员的抽象能力提出了很高的要求。

总结来说,就是抽象;从实践上来说,就是依赖接口、或者抽象类,而不要依赖具体对象。这也是另一条面向对象设计原则所倡导的:面向接口编程。

要做到对扩展开放,轻易增加新特性,需要把同类型的可变性封装在一起。试想如果内存的部分功能,和显卡都做到了同一个组件上,需要升级内存时,是不是也要把显卡也升级了?这对扩展开放了,但是开放得不够友好。

总结来说,就是封装可变性;从实践上来说,就是把同类特性封装到一个对象中,而不要散落在各处。这也是另一条面向对象设计原则所倡导的:单一职责。

四、开闭原则在其他领域的应用

不只是面向对象设计领域,其他领域也能找到开闭原则的影子。

redis cluster的数据分片设计:

  • 寻找key对应的redis实例时,没有让hash(key)直接依赖redis实例,而是抽象出一层哈希槽,让hash(key)与哈希槽形成稳定的依赖关系(对修改关闭)

  • 哈希槽与redis实例的关系时可变的,可以轻易进行水平扩展(对扩展开放)

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

推荐阅读更多精彩内容