访问者模式

设计模式——个人理解

懵懂的女人 提交于 2019-12-03 21:15:22
写在前面 设计模式是基于固定设计场景的一套解决方案,目的是为了完成开闭原则,或者说面向后续的需求变更,以成本最低的改动和测试完成新功能。同时设计模式也是一种程序员之间的交流语言,可以省去很多沟通成本。 在工作的过程中,从最初不知如何使用设计模式,到中间刻意使用设计模式,到今天稍有好转的正确的使用设计模式,踩了许多坑,也有过度设计的时候,为了避免今后在犯同样的错误,所以准备将自己在项目实践的过程中使用过的设计模式记录下来。 设计模式中,有一些实战里用过,有的没用过,没用过的应该是对这个设计方法没有领悟透彻,所以不知道该怎么用。 目前先按照自己的理解记录下来,有更深的领悟会更新。 创建型设计模式 1、工厂方法模式(FactoryMethod) 工厂方法模式的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。” 工厂方法模式,是在抽象类中定义创建对象的方法,调用声明创建过程(抽象方法,但创建对象的过程的实现是在实现类中定义。 也就是说,在创建对象时,创建步骤是固定的,但各个步骤的实现是多种多样的,这种情况下可以使用工厂方法。 例如:创建一个电脑主机,需要安装CPU,内存,硬盘,显卡。这个安装步骤是固定的,但是由不同的工厂实现类去实现这几个步骤。 这种父类声明,子类实现的方式有很多,把这种方法用于创建对象,就叫工厂方法

设计模式之访问者模式

半城伤御伤魂 提交于 2019-12-03 12:11:49
访问者模式的实现 访问者模式就是针对不同的资源设置不同的访问权限, 反转这访问权限的设置位置,从而达到不修改资源来控制访问权限的目的. 先设置一个元素材资源和元访问权限 public class unionLevel { public String getLevelName(unionVisitor visitor){ return "see union level"; }; } public interface unionVisitor { /** * 看第一级素材 * @return */ default String seeLevelOne(unionLevel level){ return level+" forbidden"; } /** * level two * @return */ default String seeLevelTwo(unionLevel level){ return level+" forbidden"; } /** * level three * @return */ default String seeLevelThree(unionLevel level) { return level+" forbidden"; } } 设置多级素材继承元素材 public class LevelOne extends unionLevel{

14.访问者模式

匿名 (未验证) 提交于 2019-12-02 23:53:01
将观众分为男和女,对歌手进行测评,当看完某个歌手表演后,得到他们对该歌手不同的评价(成功、失败等) 1)封装一些作用于某种数据结构的各元素操作,在不改变数据结构的前提下定义作用于这些元素的新的操作。 2)将数据结构与数据操作分离,解决 数据结构和操作耦合性问题 3)基本工作原理:在被访问的类里面增加一个对外提供接待访问者的接口 1)Visitor是抽象访问者,为该对象结构中的ConcreteElement的每一个类声明一个visit操作 2)ConcreteVisitor:是一个具体的访问者实现每个有Visitor声明的操作,是每个操作实现的部分. 3)ObjectStructure 能枚举它的元素,可以提供一个高层的接口,用来允许访问者访问元素 4)Element 定义一个accept方法,接收一个访问者对象 5)ConcreteElement 为具体元素,实现了accept 方法 /** * 抽象访问者 */ public abstract class Action { //得到男性 的测评 public abstract void getManResult(Man man); //得到女的 测评 public abstract void getWomanResult(Woman woman); } /** * 具体访问者 */ public class Fail

访问者模式

非 Y 不嫁゛ 提交于 2019-12-02 11:09:56
一、访问者模式介绍 访问者模式,是封装一些作用于某种数据结构的各元素操作,它可以在不改变数据结构的前提下,定义作用域这些元素的新的操作。主要将数据结构与数据操作分离,解决数据结构和操作耦合性问题。 访问者模式的基本工作原理是:在被访问的类里面加一个对外提供接待访问者的接口。 二、访问者模式原题图 说明: 1)visitor:是抽象访问者,为该对象结构中的ConcreteElement的每一个类声明一个visit操作 2)ConcreteVisitor:是一个具体的访问者,实现每个有vistor声明的操作,是每个操作实现的部分 3)ObjectStructure:能枚举它的元素,可以提供一个高层的接口,用来允许访问者访问元素 4)Element:定义一个accept方法,接收一个访问者对象 5)ConcreteElement:为具体元素,实现了accept方法 三、访问者模式例子 将人分为男人和女人,对歌手进行测评。当看完某个歌手表演后,得到他们对该歌手不同的评价(评价有不同的种类,比如成功、失败等),请使用访问者模式来实现。 类图如下所示: 代码如下所示: 创建Action抽象类及其子类: public abstract class Action{ //获取男性的测评 public abstract void getManResult(Man man); //获取女性测评

访问者模式

 ̄綄美尐妖づ 提交于 2019-12-02 03:09:48
  访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。   访问者模式适用于数据结构相对稳定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开。   数据结构的每一个节点都可以接受一个访问者的调用,此节点向访问者对象传入节点对象,而访问者对象反过来执行节点对象的操作。这样的过程叫做"双重分派"。节点调用访问者,将它自己传入,访问者则将某算法针对此节点执行。 1. 结构 类图如下: 涉及的角色如下: 抽象访问者(Visitor)角色:声明了一个或者多个方法操作,形成所有的具体访问者角色必须实现的接口。 具体访问者(ConcreteVisitor)角色:实现抽象访问者所声明的接口,也就是抽象访问者所声明的各个访问操作。 抽象节点(Node)角色:声明一个接受操作,接受一个访问者对象作为一个参数。 具体节点(ConcreteNode)角色:实现了抽象节点所规定的接受操作。 结构对象(ObjectStructure)角色:有如下的责任,可以遍历结构中的所有元素;如果需要,提供一个高层次的接口让访问者对象可以访问每一个元素;如果需要,可以设计成一个复合对象或者一个聚集,如List或Set。 代码如下:   抽象访问者角色:为每一个具体节点都准备了一个访问操作。由于有两个节点,因此,对应就有两个访问操作。

设计模式-行为型-访问者模式

假如想象 提交于 2019-12-01 01:23:24
访问者模式(Vistor):   访问者模式的官方定义是这样的:表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。官方的东西总是晦涩难懂的,那么我们现在就来拆解一下: 首先"一个作用于某对象结构中的各元素的操作",提到了三个东西:对象结构、元素、操作。我们都学习过数据结构,数据结构中大家对数据的访问一般都是直接访问其地址。在面向对象的设计中,我们一般也是将数据的访问操作放在类的内部,便于访问。这种设计看似没有什么问题,但当我们想要采用不同方式访问数据或对象结构时就必须要对类进行修改,这样就违反了 OCP原则 。于是大家会想到将数据结构与操作分离开来,当问们需要添加访问操作的时候直接添加新的类,原来的代码不需要做任何改变,这也是后半句提到的"可以在不改变各元素类的前提下定义作用于这些元素的新操作"。 访问者模式的角色:      1)Visitor:接口或抽象类,定义了对每个Element访问的行为,它的参数就是被访问的元素,它的方法个数理论上与元素的个数是一样的,因此,访问者模式要求元素的类型要稳定,如果经常添加、移除元素类,必然会导致频繁地修改visitor接口,如果出现这种情况,则说明不适合使用该模式。   2)ConcreteVisitor:具体的访问者,它需要给出对每一个元素类访问时所产生的具体行为。   3

行为型设计模式(下)

蹲街弑〆低调 提交于 2019-11-30 19:19:39
策略模式:    1、定义: 定义了一系列算法,并将每个 算法封装起来 ,使它们可以 相互替换 ,且算法的变化不会影响使用算法的客户    2、模型结构:     (1)抽象策略(Strategy)类:定义了一个公共接口,各种 不同的算法以不同的方式实现这个接口 ,      环境角色使 用这个接口调用不同的算法 ,一般使用接口或抽象类实现     (2)具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供 具体的算法实现     (3)环境(Context)类: 持有 一个策略类的引用,最终给客户端调用    3、优点:     (1)使用策略模式可以 避免使用多重条件转移语句     (2)提供一系列可供重用的算法族,恰当使用继承可以把算法族的公共代码转移到父类里面,从而 避免重复的代码     (3)提供了对 “开闭原则” 的完美支持,在不修改原有系统的基础上选择算法或行为,也可灵活地增加新算法或行为     (4)策略模式可以提供相同行为的不同实现,客户可根据 不同的要求选择不同的实现     (5)策略模式把算法的使用放到环境类中,而算法的实现移到具体策略类中,实现了 二者的分离    4、缺点:     (1)客户端必须 理解 所有策略算法的 区别 ,以便 适时选择恰当 的算法类     (2)策略模式将造成 产生很多策略类

004-行为型-09-访问者模式(Visitor)

依然范特西╮ 提交于 2019-11-30 09:38:13
一、概述   它分离对象的数据和行为,使用Visitor模式,可以不修改已有类的情况下,增加新的操作。    主要解决: 稳定的数据结构和易变的操作耦合问题。    注意事项: 访问者可以对功能进行统一,可以做报表、UI、拦截器与过滤器。 1.1、适用场景   1、对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作。   2、需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,也不希望在增加新操作时修改这些类。 1.2、优缺点   优点: 1、符合单一职责原则。 2、优秀的扩展性。 3、灵活性。   缺点: 1、具体元素对访问者公布细节,违反了迪米特原则。 2、具体元素变更比较困难。 3、违反了依赖倒置原则,依赖了具体类,没有依赖抽象。 1.3、类图角色及其职责      访问者模式的角色和职责    1、 访问者角色(Visitor): 为该对象结构中具体元素角色声明一个访问操作接口。该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色。这样访问者就可以通过该元素角色的特定接口直接访问它。    2、具体访问者角色(Concrete Visitor): 实现每个由访问者角色(Visitor)声明的操作。    3、元素角色(Element): 定义一个Accept操作,它以一个访问者为参数。    4

访问者模式

血红的双手。 提交于 2019-11-28 18:10:00
定义 表示作用于某对象结构中的各元素的操作。它可以使你在不改变各元素的类的前提下定义作用于这些元素的新操作 [引用大话设计模式概念] 维护了开放-封闭原则(拓展开放,更改封闭) 应用场景 适用于数据结构相对稳定的系统 例:1. apt(注解处理工具)通过访问者模式解析注解(参照Think in Java P632);2.大话设计模式中,男人和女人对待不同状态做出不同相应的例子 优缺点 优点 处理与数据结构分离(解耦合) ps: 这里的数据结构举例:人类中只有男人女人,男人和女人就是人类的数据结构 使用双分派 增加新的操作时,只需要增加新的访问者,无需改动其他代码(可参照下例代码) 客户端调用时,调用元素的 accept 方法,具体访问者作为参数 accept 方法中,调用访问者的方法,并将自己(具体元素)作为参数传入 增加新的访问者(新的操作)很容易, 缺点 增加新的数据结构会很困难 例如,人类中增加一个种类,那么所有的访问者都要增加一个对此种类的处理 类图 访问者模式类图.jpg 类图中有四个重要元素: Visitor 、 ConcreteVisitor 、 Element 、 ConcreteElement 抽象访问者(Visitor):为每个 Element 的实现声明一个 Visit (访问)操作,可为接口或抽象类 具体访问者(ConcreteVisitor)

设计模式简介及常用应用场景

有些话、适合烂在心里 提交于 2019-11-28 12:48:42
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 其实还有两类:并发型模式和线程池模式。 常用应用场景: 工厂模式 :IOC就是典型的工厂模式 代理模式 :AOP就是代理实现的 Facade模式 :shiro框架的核心 单例模式 Spring默认就是单例 不变模式 string 八大基本数据类型都是单例 Future 模式 异步调用。即请求时只拿到一个契约,约定以后可以获取这个东西 来源: https://www.cnblogs.com/duguangming/p/11407721.html