【转】设计模式

地址:https://runningegg.cn/2018/10/10/设计模式/

本文主要是为了能够对设计模式有一个全面的了解

为什么需要设计模式

  原来只是单纯的听别人的理解,而没有自己很好的体会和领悟。借着这次设计支付网关的机会,重新对设计模式有了新的体会。对于我而言,设计模式能够保证在下一次改造中,你只需要添加功能,而完全不需要影响其他功能。最明显的好处就是,测试就不用在测一遍上次的测试内容了。
  就像在我的这次设计支付网关的过程中,简单的使用了工厂模式。完全的隔离了各个不同支付渠道的细节,上层只需要关注 pay(),query(),refund()提供的能力,完全不必关注是支付宝还是微信。当我需要添加一个支付渠道的时候,仅仅需要重新添加一个支付渠道,而完全不需要需改支付的业务逻辑。这很大的提升了业务的灵活性。
  设计模式很神奇,他并不是为了让你的代码简洁,也并不是为了让你出更少的bug。只是保证了,“每一次代码的变动都不会影响以前的代码而已”。但是,正因为这一点,越少的改动就越能够保证更少的bug产生。

设计模式的种类

都知道设计模式分为三种:创造模式、结构模式、行为模式。

  • 创造模式,是最好理解的。当你需要产生一个对象,但是呢?这个拥有极大的可变可能,你不想直接写死了。
  • 而结构模式和行为模式却很难区分,当你看到一个设计模式的时候,有时候并不能第一时间说出它是属于哪种模式。例如,模板模式属于的是行为模式。那么笔者还是希望通过自己的概括来总结一下,结构模式更多的是“通过抽象出来一层,来屏蔽你对细节的感知”。而行为模式,则是“通过对象之间的关系,来代替控制流”
结构模式 行为模式
通过抽象出来一层,来屏蔽你对细节的感知 通过对象之间的关系,来代替控制流

结构模型的概括比较好理解,行为模型这个就比较困难了。
  举个例子会比较清楚,我们都知道下订单之后会有一系列的动作产生,比如扣减库存,买入原料,计入财务。如果是控制流的设计就是:下订单 -> 扣减库存 -> 买入原料 -> 计入财务。是不是看起来很对,很简单。
  但是呢,第二个版本,产品就说了,因为某些不可抗拒的原因,要新加一个动作。于是呢,你就得屁颠屁颠的去调整,但是如果你侵入了代码去修改了原有的动作,意味着就得重新测试,重新修bug。如果通过对象的方式来理解这个控制流,使用不同的对象来监听下订单这个动作。没错,我说的就是观察者模式,扣减库存是库存监听器,买入原料是采购监听器,计入财务是会计监听器。新加一个控制流,仅仅是简单的新加一个监听器,根本不需要改动原来下订单那个部分任务的代码。

那么这样而言,是不是提升了灵活性,有减少改旧代码而产生bug的可能。

模式的典型使用场景

  对于一些厉害的程序员,他们设计过各种业务场景,对于设计模式的运用也是顺手就来。但是呢,像我们这样的小萌新,可能会出现根本不知道在什么时候该使用设计模式的现状。那么,我想出一招,简单直接。直接google一些设计模式的使用场景,把他们记下来甚至说背下来不就行了。当你碰到某种业务,自然而然的就会想起这种业务好像和XX业务类似,我是不是可以使用这种设计模式。

设计模式 使用场景
单例模式 Spring Bean管理
工厂模式 不同支付渠道
门面模式 邮件服务
中介者模式 Spring Distrpatch
责任链模式 过滤器
策略模式 爬虫的情况,需要针对不同平台采用不同代码
观察者模式 下订单之后的业务
模板模式 MQ中,子类定义配置例如broker地址,父类完成发送的
状态模式 订单不同状态,采用不同行为(状态机)

设计模式汇总

分类 内容
创造模式 工厂模式、抽象工厂模式、原型模式、创造者模式、单例模式
结构模式 适配器模式、桥梁模式、组合模式、装饰模式、门店模式、享元模式、代理模式
行为模式 责任链模式、命令模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板模式、访问者模式

资料

有兴趣的同学可以看下MVC中包含了哪些设计模式:

https://www.kancloud.cn/sstd521/design/193646

还有一个是国外的网站,汇总了23种设计模式:

https://refactoring.guru/design-patterns/what-is-pattern

同时推荐一下这个电子书,讲解了为什么出现面向对象。(简单的讲就是因为面向对象更好的解决了软件工程不断变化的情况):

https://www.kancloud.cn/yunhua_lee/oobaodian/110920

当然还有我的总结:

https://runningegg.cn/2018/08/26/面向对象/#more

现在看来,当你有了面向对象的概念的时候,才是对软件行业正在入门了吧。

猜你喜欢

转载自blog.csdn.net/u013870094/article/details/85804400