zoukankan      html  css  js  c++  java
  • 设计模式-策略模式&状态模式&访问者模式

    1. 策略模式:参见https://www.cnblogs.com/wuyudong/p/5924223.html

    策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。

    这个模式涉及到三个角色:

      ● 环境(Context)角色:持有一个Strategy的引用。

      ● 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

      ● 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。

    策略模式的使用场景:

    1)针对同一种问题的多种处理方式、仅仅是因为具体行为有差别时,

    2)需要安全的封装多种同一类型的操作时

    3)出现同一抽象类有多个子类,而又需要使用if-else或者switch-case来选择具体子类时。

    例如:

    2. 状态模式:参见https://www.cnblogs.com/ysw-go/p/5404918.html

    1)状态模式(State)的定义

    定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类

    状态模式(State)适用性。

    •   一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
    •   一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。

          这个状态通常用一个或多个枚举常量表示。

          通常,有多个操作包含这一相同的条件结构。

          State模式将每一个条件分支放入一个独立的类中。

          这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。

    2)状态模式(State)的参与者

    • Context

          定义客户感兴趣的接口。

          维护一个ConcreteState子类的实例,这个实例定义当前状态。

    • State

          定义一个接口以封装与Context的一个特定状态相关的行为。

    • ConcreteStatesubclasses

          每一子类实现一个与Context的一个状态相关的行为。

     

    状态模式将各个状态所对应的操作分离开来,即对于不同的状态,由不同的子类实现具体操作,不同状态的切换由子类实现,当发现传入参数不是自己这个状态所对应的参数,则自己给Context类切换状态;而策略模式是直接依赖注入到Context类的参数进行选择策略,不存在切换状态的操作练习
    联系:
    状态模式和策略模式都是为具有多种可能情形设计的模式,把不同的处理情形抽象为一个相同的接口,符合对扩展开放,对修改封闭的原则。还有就是,策略模式更具有一般性一些,在实践中,可以用策略模式来封装几乎任何类型的规则,只要在分析过程中听到需要在不同实践应用不同的业务规则,就可以考虑使用策略模式处理,在这点上策略模式是包含状态模式的功能的,策略模式是一个重要的设计模式。
     
    3. 访问者模式  参见:http://blog.csdn.net/u012124438/article/details/70537203

    访问者模式,是行为型设计模式之一。访问者模式是一种将数据操作与数据结构分离的设计模式,它可以算是 23 中设计模式中最复杂的一个,但它的使用频率并不是很高,大多数情况下,你并不需要使用访问者模式,但是当你一旦需要使用它时,那你就是需要使用它了。 

    访问者模式的基本想法是,软件系统中拥有一个由许多对象构成的、比较稳定的对象结构,这些对象的类都拥有一个 accept 方法用来接受访问者对象的访问。访问者是一个接口,它拥有一个 visit 方法,这个方法对访问到的对象结构中不同类型的元素做出不同的处理。在对象结构的一次访问过程中,我们遍历整个对象结构,对每一个元素都实施 accept 方法,在每一个元素的 accept 方法中会调用访问者的 visit 方法,从而使访问者得以处理对象结构的每一个元素,我们可以针对对象结构设计不同的访问者类来完成不同的操作,达到区别对待的效果。 

    定义及使用场景

    定义:封装一些作用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下定义作用于这些元素的新的操作。

    可以对定义这么理解:有这么一个操作,它是作用于一些元素之上的,而这些元素属于某一个对象结构。同时这个操作是在不改变各元素类的前提下,在这个前提下定义新操作是访问者模式精髓中的精髓。

    使用场景: 
    (1)对象结构比较稳定,但经常需要在此对象结构上定义新的操作。

    (2)需要对一个对象结构中的对象进行很多不同的且不相关的操作,而需要避免这些操作“污染”这些对象的类,也不希望在增加新操作时修改这些类。

    UML图

    这里写图片描述

    (1)Visitor:接口或者抽象类,它定义了对每一个元素(Element)访问的行为,它的参数就是可以访问的元素,它的方法数理论上来讲与元素个数是一样的,因此,访问者模式要求元素的类族要稳定,如果经常添加、移除元素类,必然会导致频繁地修改Visitor接口,如果这样则不适合使用访问者模式。

    (2)ConcreteVisitor1、ConcreteVisitor2:具体的访问类,它需要给出对每一个元素类访问时所产生的具体行为。

    (3)Element:元素接口或者抽象类,它定义了一个接受访问者的方法(Accept),其意义是指每一个元素都要可以被访问者访问。

    (4)ConcreteElementA、ConcreteElementB:具体的元素类,它提供接受访问方法的具体实现,而这个具体的实现,通常情况下是使用访问者提供的访问该元素类的方法。

    (5)ObjectStructure:定义当中所说的对象结构,对象结构是一个抽象表述,它内部管理了元素集合,并且可以迭代这些元素供访问者访问。

     
  • 相关阅读:
    正则表达式的规则
    数组合并函数,二维数组相同字段合并到一起。
    mysql如果在使用多表连查时,两张或多张表出现相同的字段名的解决办法
    mysql多表查询方法(left join(左连接),right join (右连接),inner join (内连接)的区别)
    针对ueditor编译器发送数据后不能自动清空表单的问题
    mysql数据库分组查询小结
    ubuntu下命令详细小结
    STL 的运用 istringstream的运用
    odeforces Beta Round #77 (Div. 2 Only)
    位运算基础
  • 原文地址:https://www.cnblogs.com/txfsheng/p/8392426.html
Copyright © 2011-2022 走看看