设计模式(十一)访问者模式 状态模式 解释器模式

好了,这个鬼玩意儿,前前后后持续了好多年才完成。终于迎来最后几个模式了。此刻,我的心情是复杂的。有万分之九千浪费光阴的悔恨,又有万分之一的满意。
老实说,这种枯燥的东西,对我这样的普通人来讲,耐着性子看完也算不错了。前前后后几本书交替着看,勉强隐约地窥见了部分门道。

又老实说,我还是很担心和焦虑的。这样一个很小的模组,居然花了我四个月的时间。而已只是完成了基础模式的部分。我这口老血吐的头发都白了。要不是加入007,真是不容易持续下来啊。

为啥我写这么多废话呢,因为评论老实说看不懂。我就前面写点能看懂的。看不懂是正常的,你看懂了就不是正常人了。本来是专业论坛,不是面向一般读者的。我本来写这个也不是为了科普,也不是给别人看的,就是给自己写的,好歹走完过场。有心了解的百度设计模式这几个字,有的人每次问得我非常头痛,非常非常头疼。

回忆起来写这几段我确实有点失控了。

我翻了一下这几本书,差不多后面还有两三章的综合学习内容。我觉得后面再写三篇吧。这样就到6月份了。这种学习进度太慢了吧,我还有其它好多书要看啊。我也不知道怎么办才好。好想把时间冻结。。。

废话就此结束,我们开始看最后这几个模式吧!

访问者模式

其实这个是上次的作业内容,但是有些东西没看懂,就挪到这一章了。

访问者模式(Visitor Pattern)的目的是封装一些施加于某种数据结构元素之上的操作,一旦这些操作需要修改,接受这个操作的数据结构则可以保持不变。

简单地说,就是把一些数据获取出来,重新根据需要的形式来整理,这样就不用改变原来数据的结构。
在这里插入图片描述
比如说,我们班已经有了同学名录的表格,这时候校长要统计所有2010年出生的学生,而政府要统计家庭年收入小于5000块的贫困生,那么就拷贝一份数据重新筛选这些学生就好了,不用在以前的名录里面反复改来改去,免得到处都要改,整的乱七八糟的。

状态模式

状态模式(State Pattern)又称为状态对象模式,该模式允许一个对象在其内部状态改变时改变其行为。
在这里插入图片描述

这个不太好理解,来张实例类图:
在这里插入图片描述

你看,它就像工厂模式一样。。。

如果我只看了这本书,那么肯定会觉得这也算一个模式?太幼稚园了吧?历史表明,任何我看来简单的东西,一定是我自己还没看懂。所谓很傻很天真。

果然,还是另一本书写得好!复杂!电梯举例:开门、关门、运行、停止。和上面切换CCAV一样,简单吧!
可是,他居然给了一张二维状态表:

在这里插入图片描述
你想想,电梯门可以打开,但不是随时都可以开,是有前提条件的。你不可能电梯在运行的时候突然开门吧?!电梯也不会出现停止了但是不开门的情况吧?!那要是有也是事故嘛,再仔细想想,电梯的这4个动作的执行都有前置条件,具体点说就是在特定状态下才能做特定事。在这里插入图片描述
所以,我们需要在不同状态下,设置不同的动作。我们不同在运行中开门,也不能在开门时运行。通过状态模式,在内部根据其状态屏蔽某些操作,这也才能保证安全。

解释器模式

解释器模式(Interpreter Pattern)是一种按照规定语法对表达式进行解析的方案。

这个我不懂。看完了例子也没懂。所以多看了几本书。

若仅仅对数字采用四则运算,每个程序员都可以写出来。但是增加了增加模型公式就复杂了。先解释一下为什么需要公式,而不采用直接计算的方法,例如有如下3个公式:
业务种类1的公式:a+b+c-d。
业务种类2的公式:a+b+e-d。
业务种类3的公式:a-f。
其中,a、b、c、d、e、f参数的值都可以取得,如果使用直接计算数值的方法需要为每个品种写一个算法,目前仅仅是3个业务种类,那上百个品种呢?歇菜了吧!建立公式,然后通过公式运算才是王道。

公式中有什么?仅有两类元素:

  • 运算元素
    运算元素就是指a、b、c等符号,需要具体赋值的对象,也叫做终结符号。
    为什么叫终结符号呢?因为这些元素除了需要赋值外,不需要做任何处理,所有运算元素都对应一个具体的业务参数,这是语法中最小的单元逻辑,不可再拆分;

  • 运算符号
    运算符号就是加减符号,需要我们编写算法进行处理,每个运算符号都要对应处理单元,否则公式无法运行,运算符号也叫做非终结符号。

两类元素的共同点是都要被解析,不同点是所有的运算元素具有相同的功能,可以用一个类表示,而运算符号则是需要分别进行解释,加法需要加法解析器,减法需要减法解析器。分析到这里,我们就可以先画一个简单的类图:
在这里插入图片描述
这个类图很简单吧?简单的不做上面的解释我也看不懂。两类元素都继承表达式,其中运算符号要分别有不同的类。这样就很清晰了。

不过我们要增加优先级,毕竟乘除法更加重要,我也不知道谁定义的。要是我的话,谁在前面谁先算,凭啥乘除法要特殊些呢?你想优先自己加个括号不行吗?真是的。为了加这个,我们还得先吧计算结果存起来,留到后面处理。增加一个计算类Calculator,外面只和它打交道:

在这里插入图片描述

解释器是一个简单语法分析工具,它最显著的优点就是扩展性,修改语法规则只要修改相应的非终结符表达式就可以了,若扩展语法,则只要增加非终结符类就可以了。

这个模式运行其实比较少,又有点云里雾里的,我就不继续写了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值