博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
生活中的设计模式
阅读量:5211 次
发布时间:2019-06-14

本文共 2924 字,大约阅读时间需要 9 分钟。

    设计模式这个概念应该大家都很不陌生了。这么多模式当中其实真正用到的,实际上很少。正由于用的少导致我们刚刚开始学习的时候相当困难!然而呢,实际项目中由架构师设计的框架都是充满了设计模式的气息,让我们这些“菜鸟”望而生畏,总是被Leader推着走。

    接下来我就从我的一些项目案例来讲下我理解的所谓模式。

 

 

案例一

   淘宝买过东西的人都应该知道一个流程:“拍下商品”->“付款到支付宝”->“卖家发货”->“确认收货”->“评价”。

 

作为“菜鸟”的我,一开始想到的代码段为:

 

初始版

 

1:   if ("拍下商品")
2:   {
3:                  //更新为拍下商品
4:                  //...一些业务操作
5:   }else if ("付款到支付宝")
6:   {
7:                  //更新为拍下商品
8:                  //...一些业务操作
9:   }
10:   ....

 

问题就随之而来了,由于每一步操作(即if操作)我们都有很多业务上的操作或者业务逻辑。那么这个方法的行数就不敢恭维了。

 

当你发现去写某个方法或者修改某个方法心里用的很不爽的时候,那么就得考虑用些OOP思想去规避这些问题。

 

修改版本

要用OOP思想优化代码,首先要面临的是一个你看这个业务的观察点。观察点的不同,设计出的框架也随之不同。

作为“菜鸟”的我找到了两个切入点:

  • 将“每一个过程”作为主要观察点。
  • 将“这整个过程”作为主要观察点。

第一个的代码段为:

1:  public class 拍下商品
2:   {
3:        public void DoSomething()
4:        {
5:        }
6:    }
7:   
8:  public class 付款到支付宝
9:   {
10:        public void DoSomething()
11:        {
12:        }
13:    }
14:   
15:  ...接下来类似

 

第二个代码段为:

1:      class 过程
2:      {
3:          public void 拍下商品()
4:          {
5:          }
6:   
7:          public void 付款到支付宝()
8:          {
9:          }
10:   
11:        ...类似操作
12:   
13:          public void DoSomething()
14:          {
15:              拍下商品();
16:              付款到支付宝();
17:              ....类似操作
18:          }
19:      }

 

从第一个代码段来分析:“过程的链接”职责变为了“调用者”。然而第二段代码段“过程的链接”的职责是框架担任的。

具体选取那种得结合项目设计和业务需求选取。

 

优化第一个代码段(“将“每一个过程”作为主要观察点。”)

首先我们发下我们“每个过程”都会做一些“固定的操作”即(“DoSomething”操作),那么由此我们就可以提取个接口IAction

1:  public interface IAction
2:  {
3:         void DoSomething();
4:  }

如果当业务不断的扩大的话,可能DoSomething这个方法又会遇到一开始的弊端“方法过于肥大”,那么又应该对该方法进行OOP优化。然后我们发现我们似乎又回到了最初的问题,那么这里按照上面我的这种观察点的选取又会出现两种。

一个以“每个过程”为观察点,一个以“整个过程”为观察点。

 

这里我们先以“每个过程”为观察点为例子。

 

 

DoSomething方法可以被分为DoA,DoB,DoC … 。按照上面的分析以“每个过程”为观察点,“过程链接”职责要变为“调用者”维护。换句话说:

1:  public void DoSomething()
2:  {
3:           DoA();
4:           DoB();
5:           DoC();
6:           ...
7:  }

 

接着我们发下“每个过程”都会上面类似的代码段,因为都实现了“IAction”接口。这样的话我们的接口感觉就定义的有点“胖”了,修改后的接口为:

1:  public interface IAction
2:  {
3:          void DoA();
4:          void DoB();
5:          void DoC();
6:         ....
7:  }

然后我们在来看看一开的代码变成什么样子了:

1:  public class 拍下商品:IAction
2:  {
3:       public void DoA()
4:       {
5:             //....
6:       }
7:   
8:       public void DoB()
9:       {
10:             //....
11:       }
12:   
13:       public void DoC()
14:       {
15:             //....
16:       }
17:   
18:  }

 

那这样就剩下一个问题了:“如何把DoA,DoB,DoC”串联起来,即维护最外层的“调用链”职责。

1:  public class ActionManager
2:      {
3:          private IAction _action = null;
4:          public ActionManager(IAction action)
5:          {
6:              _action = action;
7:          }
8:   
9:          public void DoSomething()
10:          {
11:              _action.DoA();
12:              _action.DoB();
13:              _action.DoC();
14:          }
15:      }

那么使用方式为:

1:  var actionMgr = new ActionManager(拍下商品);
2:   
3:  actionMgr.DoSomething();

 

未完待续…

转载于:https://www.cnblogs.com/hankskfc/p/3406646.html

你可能感兴趣的文章
vue:axios二次封装,接口统一存放
查看>>
Js三大特性--封装、继承以及多态
查看>>
2019年8月2日07:51:10 马上要撤
查看>>
vue中router与route的区别
查看>>
js 时间对象方法
查看>>
ES5和es6的封装继承
查看>>
call和apply区别
查看>>
Vue2路由鉴权
查看>>
网络请求返回HTTP状态码(404,400,500)
查看>>
用 async/await 来处理异步
查看>>
CSS3实现0.5像素边框
查看>>
koa2 允许跨域
查看>>
小程序处理富文本路径
查看>>
饿了么ui 省市区 三级联动框架
查看>>
NodeJs 实现简单WebSocket 即时通讯
查看>>
AMD 和 CMD 的区别有哪些?
查看>>
微信小程序获取formid
查看>>
js中import和require的区别
查看>>
解决vuejs 创建数据后设置对象的属性实现不了双向绑定问题
查看>>
BS模式与CS模式的区别
查看>>