设计模式总结4.2--行为模式

行为模式2组包含了迭代器模式、备忘录模式、策略模式、解释器模式、中介者模式和访问者模式。

 

1.迭代器模式:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。

1.1 UML图:

1.2 模式解析:建立一个迭代器,将聚集中的所有元素都访问一遍,并且不暴露元素的内部具体代码(使用了聚集,其中的元素所代表的内容不外显)

1.3 模式适用情况:当需要访问一个聚集对象,并且不管这些对象是什么都需要遍历的时候,使用此模式

*注:在C#、JAVA中的foreach in方法就能完成这个模式。

 

2.备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

2.1 UML图:

2.2 模式解析:由创建者(Originator)创建一个可记录内部状态的备忘录,该备忘录内存有创建者想保存的内部状态。当创建者想要恢复存入备忘录时刻的状态时,再调用备忘录内的数据即可。

Caretaker类负责隐藏创建者创建备忘录、使用备忘录的细节。

2.3 模式适用情况:适用于功能复杂的、但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时

 

3.策略模式:定义了算法家族,分别封装了起来,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户。

3.1 UML图:

3.2 模式解析:将各个算法封装起来(每个算法都包含了其能进行操作所需要的所有信息)并且可被相互替换(功能类似)。

Context类可以通过客户端实例化时构造函数的传参来得到一个具体策略对象,并且可以调用这个具体策略的方法。

3.3 模式适用情况:在分析过程中听到需要在不同时间应用不同业务规则时考虑使用此模式。

 

4.解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

4.1 UML图:

4.2 模式解析:这个模式是将一种原本用户理解不了的文法解析成一种能被用户所理解的语言。

难点在解释操作中:终结符表达式和非终结符表达式。本身我在看到这两个名称与解释时就很懵,而且由于教材中的例子没有涉及到非终结符表达式,因此自己去网上查了一下,总算有了一些头绪:

(P.S:借鉴了https://blog.csdn.net/niunai112/article/details/79982712这篇博客,感谢巨人)

终结符表达式可以直接返回被解释出的结果,类似树叶;非终结符表达式则是还需要向下分层计算,类似树杈(这个比喻有些像组合模式)。

举个例子,比如我让一个孩子做计算题:one plus two。可是我的受众群体是一名一年级的小学生,而且他从来没学过英语(然而现在的孩子很早就开始接触英语了...),这时我们就要用到解释器模式:"plus"是非终结符对象,解释器将其解释为"+",但光解释一个"+"没有实际意义,我们还要计算出结果,因此还要继续解析"one"和"two"(可以理解为"one"和"two"是非终结符类中的两个参数);而"one"和"two"是两个终结符对象,可以直接输出为"1"和"2",此时非终结符对象"+"再用这两个直接输出的结果执行运算,就得出了1+2=3的结果。

4.3 模式适用情况:如果一种特定类型的问题发生频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。

*这个模式与适配器模式不同的地方在于,适配器模式是为了让某个对象执行从客户端发出的与它接口标准不符合的命令,而这个模式则是为了让客户看懂一个原本看不懂的语法。也就是说这两个模式的受众对象不一样。

 

5.中介者模式:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互作用,从而使耦合松散,并且可独立地改变它们之间的交互。

5.1 UML图:

5.2 模式解析:具体同事类之间的交互由中介者封装好,使得外部看不到每个具体同事类之间的交互过程(被交互者自身的方法藏好)。也就是说,即使两个具体对象发送消息时也并没有说明要发送给哪个具体对象(即不清楚对方的存在),发送给哪个具体对象是由中介者所完成的。

5.3 模式适用情况:中介者模式一般应用于一组对象以定义良好但复杂的方式进行通信的场合,以及想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合。

 

6.访问者模式:表示一个作用于某对象结构中的各元素操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

6.1 UML图:

6.2 模式解析:这个模式中分为两个大部分:访问类和元素类。元素类是一个稳定的数据结构(如"Person"类中只有"Man"和"Human"两种具体类);而访问者类是一个易变的算法,随时可能增加或改变自己的具体子类。而这些算法都需要使用数据结构。

算法使用数据结构时,要通过ObjectStructure类来访问数据结构。

6.3 模式适用情况:适用于数据结构相对稳定的系统。

 

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值