2个观点,带你重新理解设计模式

image

文章首发于个人博客 shuyi.tech,欢迎点击原文跳转阅读。

设计模式说白了就是传统经验的总结,它能让我们在合适的场景使用合适的模式,从而加快我们的编程速度,也能提高系统的扩展性、稳定性。这里我想就设计模式提出两个观点:

1、设计模式是用来承载复杂的业务逻辑的。
2、用好设计模式需要从变化的角度去理解业务。

设计模式用于承载复杂的业务逻辑

如果你的业务非常简单,那么基本上是不需要用到设计模式的。只有当你的业务变得复杂的时候,这才需要用到设计模式。这也是为什么设计模式总是和重构一起被提到,因为重构的时候就说明这个系统相对比较复杂了,不然也不会做崩了。

那为什么说设计模式用于承载复杂业务呢?

我们都知道设计模式都有一个类图,这些类图其实用于表示这种模式对于变化的分离(关于变化在下文会说到)。设计模式使用类图来存储复杂的业务关系,使得开发者可以专注于业务逻辑的开发,所以说设计模式用于承载复杂的业务。

image

如上图所示是策略模式的类图,Context 类是上下文类,在该类中初始化了具体的策略。Strategy 则是策略接口,ConcreteStrategies 则是具体的策略类。这个类图使用 Strategy 与 ConcreteStrategies 的实现关系,将不同策略隔离开来,开发者不需要去关心策略彼此的关系。而使用 Context 与 Strategy 的关系隔离开来,开发者不需要去关心怎么选择策略。所以说 Strategy 与 ConcreteStrategies 的关系、Context 与 Strategy 的关系(类关系)承载了一些逻辑,而就是我所说的:设计模式承载了复杂的业务逻辑。

使用设计模式去承载复杂的业务逻辑,有好也有坏,但总体来说好处比较多。坏处就是对初学者非常不友好,可能他们完全看不懂代码。好处则是熟悉设计模式的人,用设计模式可以一目了然地知道业务关系,它们使用设计模式作为语言来表达业务的关系。其次,各块代码之间相互隔离,稳定性、扩展性非常好。

从变化的视角去理解业务

我工作了5、6年,本该学什么东西都很快。但我却依旧花了一两个月的时间,慢慢琢磨每个设计模式的本质。经过一段时间的琢磨,我发现了一个理解设计模式的全新视角:变化。

很多时候我们去理解一个设计模式,我们不能仅仅知道它的类图是怎样的,这样的学习完全流于表面。我们需要知道它为什么要这么做?它这样做的原因是什么?它在什么场景下使用?经过这样的一番思考,我发现:所有设计模式的诞生,都是为了隔离变化。

在应用的时候,我们需要去分析需求中哪些是变化的,哪些是固定的。然后使用设计模式去承载变化的东西,封装固定的东西。

工厂方法模式,本质上是为了隔离创建者与使用者。为什么?因为创建者可能是多变的,而使用者则是确定的。

抽象工厂模式,本质上是为了隔离产品族。为什么?因为产品族相对是多变的,所以要把变化的东西剥离出去。

桥梁模式,本质上是为了将实现剥离出去。为什么?因为实现是多变的,而抽象则是确定的,所以要剥离出去。

代理模式,本质上是为了将多变的控制玻璃出去。为什么?因为代理本身是为了增强对目标对象的控制,那其控制的标准可能就很多,今天可能要这个条件,明天可能要那个条件。因此需要将变化的东西剥离出去,因此有了代理类。有了代理类,我们不会污染目标类。

责任链模式,变化的是对于责任的处理。

命令模式,变化的可能是命令的具体做法、执行标准。

迭代器模式,不变的是迭代模式,变化的是不同的数据结构,迭代算法不一样。

中介者模式,变化?关联?更多是帮助梳理关系。

备忘录模式,变化?没有特别大,其实就是对于类的状态记录,单独由一个类来控制。

观察者模式,变化?对于观察后的处理是不同的,是变化的。相同的是,他们都要观察获取触发。

状态模式,变化的是这些状态。

策略模式,变化的是这些具体的做法。

模板方法,变化的是具体的某个细节实现,不变的是整个流程算法。

访问者模式,变化的是不同的访问对象,不变的是我自身的处理流程(例如文件树的遍历)。

那我们应该如何从「变化」的角度去分析业务呢?有什么可遵循的套路吗?有什么最佳实践吗?

首先,我们还是应该从业务的复杂度入手,看看业务是否足够复杂。设计模式的本质是用来承载复杂的业务结构,如果业务目前还不清晰,并且也很简单,那就不要用设计模式了。

其次,我们还是应该从变化这个角度入手,分析业务系统中哪些是变化的,哪些是不变的。这个就要求你对业务非常熟悉,只有熟悉业务才能弄清楚变化在哪里。

最后,分析这种变化的各个实体关系,看看是否符合访问者模式的特征(有固定的成分,又需要变化,又不是继承关系)。

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

推荐阅读更多精彩内容