访问者模式

访问者模式

走远了吗. 提交于 2019-12-22 01:01:04
访问者模式定义如下:封装一些作用于某种数据结构中各个元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。 下面看一下几个抽象角色: Visitor抽象访问者:抽象类或接口,定义访问者可以访问哪些元素。 ConcreateVisitor具体访问者:它影响访问者访问到一个类之后该怎么办,做哪些事情。 Element抽象元素:接口或抽象类,声明接收哪一类访问者访问,程序中通过accept方法中的参数来定义 ConcreateElement具体元素:实现accept方法,通常是visitor.visit(this),基本上都是一种固定形式了 ObjectStructure结构对象:元素产生者,一般容纳在多个不同类、不同接口的容器,如List Map等,在项目中,一般很少抽象出这个角色 看一下访问者模式的通用代码: //抽象元素 public abstract class Element{ //定义业务逻辑 public abstract void doSomething(); //允许谁来访问 public abstract void accept(IVisitor visitor); } //具体元素 public class ConcreateElement1 extends Element{ //完善业务逻辑 public void doSomething(){

15.行为型 - 访问者模式 (Visitor)

本秂侑毒 提交于 2019-12-21 23:31:09
1.定义 目的是方便访问某种数据结构中的各个元素,在不改变此数据结构的前提下定义作用于这些元素的新的操作 2.UML类图 角色介绍 AbstractVisitor : 抽象访问者,定义对每一个Element的访问行为 ConcreteVisitor : 具体访问者, 实现具体访问行为 AbstractElement : 抽象元素类,定义接受AbstractVisitor访问的方法 ConcreteElement : 具体元素类 ObjectStructure : 对象结果,用于管理AbstractElement对象集合 要点 AbstractVisitor中定义了每个元素类的访问行为,所以此模式要求对象结果相对稳定,否则就做不到开闭原则 3.UML示例代码 /** * Copyright (C), 2016-2020 * FileName: AbstractClub * Author: wei.zheng * Date: 2019/12/21 18:49 * Description: 俱乐部抽象类,AbstractElement角色 */ public abstract class AbstractClub { private String name ; private int payTaxes ; public AbstractClub ( String name ) {

行为型设计模式之访问者模式(Visitor)

一笑奈何 提交于 2019-12-21 08:38:12
结构 意图 表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 适用性 一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作。 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而你想避免让这些操作“污染”这些对象的类。Vi s i t o r 使得你可以将相关的操作集中起来定义在一个类中。当该对象结构被很多应用共享时,用Vi s i t o r 模式让每个应用仅包含需要用到的操作。 定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。改变对象结构类需要重定义对所有访问者的接口,这可能需要很大的代价。如果对象结构类经常改变,那么可能还是在这些类中定义这些操作较好。 1 using System; 2 3 abstract class Visitor 4 { 5 abstract public void VisitElementA(ConcreteElementA a); 6 abstract public void VisitElementB(ConcreteElementB b); 7 } 8 9 class ConcreteVisitor1 : Visitor 10 { 11 override public void VisitElementA

设计模式:行为型模式(2)

感情迁移 提交于 2019-12-20 18:58:13
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 19、备忘录模式(Memento) 主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象,个人觉得叫备份模式更形象些,通俗的讲下:假设有原始类A,A中有各种属性,A可以决定需要备份的属性,备忘录类B是用来存储A的一些内部状态,类C呢,就是一个用来存储备忘录的,且只能存储,不能修改等操作。做个图来分析一下: Original类是原始类,里面有需要保存的属性value及创建一个备忘录类,用来保存value值。Memento类是备忘录类,Storage类是存储备忘录的类,持有Memento类的实例,该模式很好理解。直接看源码: public class Original { private String value; public String getValue() { return value; } public void setValue(String value) { this.value = value; } public Original(String value) { this.value = value; } public Memento createMemento(){ return new Memento(value); } public void restoreMemento(Memento

设计模式之访问者模式

我是研究僧i 提交于 2019-12-20 18:08:15
访问者模式   访问者(Visitor)模式,表示一个作用于某对象结构中各个元素的操作。它使你可以在不改变各元素的前提下定义作用于这些元素的新操作。 访问者模式UML类图 Visitor:为该对象结构中ConcreteElement的每一个具体类声明一个Visit操作。它的参数就是可以访问的元素,它的方法个数理论上来说是和ConcreteElement具体子类的个数是一致的。因此访问者模式要求元素(Element)的类组要稳定,如果要经常添加、移除元素类,那么必然会导致频繁的修改Visitor接口,这不适合访问者模式。 ConcreteVisitor:具体的访问者,实现由每个Visitor声明的操作。每个操作实现算法的一部分,而该算法片段乃是对应于结构中对象的类。(就是要给出对每一个ConcreteElement类进行访问时所要产生的具体行为)。 Element:定义一个Accept操作,它以一个访问为参数。意思是每一个元素都要可以被访问者访问。 ConcreteElement:具体元素类,实现Accept操作。它实现接受访问操作的具体实现,而这个具体的实现,通常情况下是使用访问者提供的访问该元素类的方法。 ObjectStructure:能枚举它的元素,可以提供一个高层接口以允许访问者访问它的元素,(这个就是模式定义中和Visitor类解释中提到的对象结构)

Visitor 访问者(行为型模式)--学习笔记

天涯浪子 提交于 2019-12-20 05:11:56
问题的提出: 在软件构建过程中,由于需求的改变,某些类层次结构中常常需要增加新的行为(方法),如果直接在基类中做这样的更改,将会给子类带来很繁重的变更负担,甚至破坏原有设计。例如下面的代码: public abstract class Shape { public abstract void Draw(); // 问题:由于Shape中增加了MoveTo方法,其各个子类将不得不随之更改 public abstract void MoveTo(Point p); // 新增加的方法,子类需要override该方法, } public class Rectangle:Shape { public override void Draw() { } } public class Circle:Shape { public override void Draw() { } } public class Line:Shape { public override void Draw() { } } 解决思路: 在不更改类层次结构的前提下,在运行时根据需要透明地为类层次结构上的各个类动态添加新的操作,从而避免上述问题。 代码: public abstract class Shape { public abstract void Draw(); // 预料到将来可能会引入新的操作 public

访问者模式(Visitor、Element、accept、ObjectStructure、)(操作外置,与数据结构分离)

我与影子孤独终老i 提交于 2019-12-20 02:40:40
访问者模式表示 一个作用于某对象结构中的各元素的操作 ,它 使你可以在不改变各元素类的前提下定义作用于这些元素的新操作 。 从定义可以看出结构对象是使用访问者模式的必备条件,而且这个结构对象必须存在遍历自身各个对象的方法,类似于Java中的Collection。 访问者模式的目的是要把 处理从数据结构中分离出来 ,如果系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式是个不错的选择,因为访问者模式使的算法操作的增加变得容易。相反,如果系统的数据结构不稳定,易于变化,则此系统就不适合使用访问者模式了。 类图: 访问者模式结构: 访问者角色(Visitor): 为该对象结构中具体元素角色声明一个访问操作接口. 具体访问者角色(Concrete Visitor): 实现每个由访问者角色(Visitor)声明的操作. 元素角色(Element): 定义一个Accept操作,它以一个访问者为参数. 具体元素角色(Concrete Element): 实现由元素角色提供的Accept操作. 对象结构角色(Object Structure): 这是使用访问者模式必备的角色. 它要具备以下特征: 能枚举它的元素; 可以提供一个高层的接口以允许该访问者访问它的元素; 可以是一个复合(组合模式)或是一个集合, 如一个列表或一个无序集合. 实例: public interface

访问者模式

自闭症网瘾萝莉.ら 提交于 2019-12-14 11:47:51
在现实生活中,有些集合对象中存在多种不同的元素,且每种元素也存在多种不同的访问者和处理方式。例如,公园中存在多个景点,也存在多个游客,不同的游客对同一个景点的评价可能不同;医院医生开的处方单中包含多种药元素,査看它的划价员和药房工作人员对它的处理方式也不同,划价员根据处方单上面的药品名和数量进行划价,药房工作人员根据处方单的内容进行抓药。 这样的例子还有很多,例如,电影或电视剧中的人物角色,不同的观众对他们的评价也不同;还有顾客在商场购物时放在“购物车”中的商品,顾客主要关心所选商品的性价比,而收银员关心的是商品的价格和数量。 这些被处理的数据元素相对稳定而访问方式多种多样的数据结构,如果用“访问者模式”来处理比较方便。访问者模式能把处理方法从数据结构中分离出来,并可以根据需要增加新的处理方法,且不用修改原来的程序代码与数据结构,这提高了程序的扩展性和灵活性。 模式的定义与特点 访问者(Visitor)模式的定义:将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。它将对数据的操作与数据结构进行分离,是行为类模式中最复杂的一种模式。 访问者(Visitor)模式是一种对象行为型模式,其主要优点如下。 扩展性好。能够在不修改对象结构中的元素的情况下

【一起学设计模式】访问者模式实战:权限管理树删除节点操作

痴心易碎 提交于 2019-12-06 12:16:39
前言 申明: 本文章首发自本人博客:https://www.cnblogs.com/wang-meng 和公众号: 壹枝花算不算浪漫 如若转载请标明来源 之前在我的博客( 一枝花算不算浪漫 )中已经更新过两篇设计模式相关的内容 【一起学设计模式】策略模式实战一:基于消息发送的策略模式实战 【一起学习设计模式】策略模式实战二:配合注解 干掉业务代码中冗余的if else... 上面内容都是基于真实业务场景精简后的设计( 工作中真实场景使用到的 )。 之前为了学习设计模式,看过网上很多相关博客讲解,大都是画下UML类图,举例几个毫不相干的demo,看了几遍仍然是云里雾里。 学习设计模式只有在真正的业务场景去使用才会更好的理解其精髓。这里举例自己工作中电商的业务场景,然后配合一些业务功能的实现,来学会设计模式,使自己的代码更优雅。 业务背景 权限功能模块-权限树-删除树上的某个权限 要求判断该权限节点及其子节点是否有用户、角色关联,如若有关联则不允许删除 要求删除该权限节点及其子节点所有数据 常规操作 先说下大多数人为了实现需求都会做的常规操作,这里举例说明,权限A,其子节点B、C 查找权限A是否被用户、角色关联过 查找全新啊A下面所有子节点B、C 查找权限B、C是否被其他用户、角色关联过 删除A、B、C 这里如果有个流程图效果会更佳,但是相信大家看到文字也能明白其中的运转流程。

设计模式——行为型模式之访问者模式(九)

房东的猫 提交于 2019-12-05 01:05:17
访问者模式介绍 最复杂的设计模式,并且使用频率不高,《设计模式》的作者评价为:大多情况下,你不需要使用访问者模式,但是一旦需要使用它时,那就真的需要使用了。 访问者模式是一种将数据操作和数据结构分离的设计模式。(觉得太抽象,可以看下面的例子)。 访问者模式的使用场景 对象结构比较稳定,但经常需要在此对象结构上定义新的操作。 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免这些操作“污染”这些对象的类,也不希望在增加新操作时修改这些类。 访问者模式的UML类图 访问者模式 角色介绍 Visitor: 接口或者抽象类,定义了对每个 Element 访问的行为,它的参数就是被访问的元素,它的方法个数理论上与元素的个数是一样的,因此,访问者模式要求元素的类型要稳定,如果经常添加、移除元素类,必然会导致频繁地修改 Visitor 接口,如果出现这种情况,则说明不适合使用访问者模式。 ConcreteVisitor: 具体的访问者,它需要给出对每一个元素类访问时所产生的具体行为。 Element: 元素接口或者抽象类,它定义了一个接受访问者(accept)的方法,其意义是指每一个元素都要可以被访问者访问。 ElementA、ElementB: 具体的元素类,它提供接受访问的具体实现,而这个具体的实现,通常情况下是使用访问者提供的访问该元素类的方法。