地址: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
现在看来,当你有了面向对象的概念的时候,才是对软件行业正在入门了吧。