访问者模式

从王者荣耀看设计模式(二十三.访问者模式)

大兔子大兔子 提交于 2020-01-24 16:02:04
从王者荣耀看设计模式 一.简介 在游戏中,根据场上状况给英雄配备合适的装备是赢的比赛的重要环节。对于刚开始玩王者荣耀(低端玩家like me),在选择装备的时候只会关注装备能给英雄带来多少伤害的增幅(装备属性),而大神级别玩家会仔细研究装备的详细描述 二.模式动机 在有些集合对象中可能存在多种不同类型的元素,而且不同的调用者在使用这些元素时也有所区别,这些调用者称为访问者。此时,可以使用访问者模式来进行系统设计。访问者模式为多个访问者访问集合对象中的多种元素提供了一种解决方案。在本实例中,集合中存储有装备"冰霜法杖"和"破魔刀"的属性和详细描述。低端玩家关注点(想要访问的对象)为集合中的属性。高端玩家关注点为集合中的详细描述。 三.访问者模式 访问者模式(Visitor Pattern):表示一个作用于某对象结构中的各元素的操作,它使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式是一种对象行为型模式 访问者模式的应用场景 在以下情况下可以使用访问者模式 ■ 一个对象结构包含很多类型的对象,希望对这些对象实施一些依赖其具体类型的操作。在访问者中针对每一种具体的类型都提供了一个访问操作,不同类型的对象可以有不同的访问操作 ■ 需要对一个对象结构中的对象进行很多不同的并且不相关的操作 ■ 对象结构中对象相应的类很少改变,但经常需要在此对象结构上定义新的操作

访问者模式(Vistor)

断了今生、忘了曾经 提交于 2020-01-22 05:05:54
一、定义 在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。 访问者模式的目的是封装一些施加于某种数据结构元素之上的操作,一旦这些操作需要修改的话,接受这个操作的数据结构可以保持不变。为不同类型的元素提供多种访问操作方式,且可以在不修改原有系统的情况下增加新的操作方式,这就是访问者模式的模式动机。 访问者模式适用于数据结构相对稳定的系统,又有易于变化的算法。 访问者模式的角色: 访问者角色(Visitor):抽象类或者接口,声明访问者可以访问哪些元素,具体到程序中就是visit方法中的参数定义哪些对象是可以被访问的。 具体访问者角色(Concrete Visitor):实现每个访问者角色(Visitor)声明的操作。 元素角色(Element):抽象类或者接口,定义一个Accept操作,声明接收哪一类访问者访问。抽象元素角色一般有两类方法,一部分是本身的业务逻辑,另外就是允许接收哪类访问者来访问。 具体元素角色(Concrete Element):实现由元素角色提供的Accept操作。 对象结构角色(Object Structure):这是使用访问者模式必备的角色

访问者模式

放肆的年华 提交于 2020-01-12 11:24:36
动机: 在软件构建过程中,由于需求的改变,某些类层次结构中常常需要增加新的行为(方法),如果直接在基类中做这样的更改,将会给子类带来很繁重的变更负担,甚至破坏原有设计。 如何在不更改类层次结构的前提下,在运行时根据需要透明地为类层次结构上的各个类动态添加新的操作,从而避免上述问题? 适用性: 1.一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作。 2.需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而你想避免让这些操作"污染"这些对象的类。Visitor使得你可以将相关的操作集中起来定义在一个类中。当该对象结构被很多应用共享时,用Visitor模式让每个应用仅包含需要用到的操作。 3.定义对象结构的类很少改变,但经常需要在结构上定义新的操作。改变对象结构类需要重定义对所有访问者的接口,这可能需要很大的代价。如果对象结构类经常改变,那么可能还是在这些类中定义这些操作较好。 该模式适用于某种操作是固定的,但是会存在不同的访问者,访问者的模式都是固定的(即方法都是来源统一的接口),只不过内部实现的方式与逻辑不同,但是访问的那一方基本固定。 (访问者需要访问Visit对象)(被访问者需要接收Accept访问者)   //访问者接口 interface IVistor { void Vist(Element element); } /

《敏捷软件开发》读书笔记(3)

倾然丶 夕夏残阳落幕 提交于 2020-01-11 04:04:07
《敏捷软件开发》读书笔记(3) 书中设计模式的汇总 命令类模式,分离执行和定义 CMD模式 其实是事件-事务绑定的模型: 可以用事件驱动,只要收到事件,执行绑定到事件对应的CMD对象.do方法就行,对于真正执行的事情无感知。解除了系统的逻辑互联关系和实际连接关系的设备之间的耦合。 事务型操作,把验证和执行分离,由执行框架完成验证和执行操作。解除了获取数据、验证数据、执行数据操作这种空间耦合,同时也可以在执行时间上进行解耦。扩展可以增加undo接口,系统把CMD对象压入堆栈,在进行回退的时候调用undo。 整体上就是把程序算法或者业务逻辑,和程序的实际控制执行解耦,有点像函数式编程。 ACTIVE OBJECT模式 这部分没看懂,似乎是多线程任务执行引擎,可以把CMD对象放回到引擎列表中。这种类型的线程任务是RTC线程。 复用算法,分离业务逻辑的模式 TEMPLATE METHOD模式 把算法的控制和逻辑分离,通用算法封装到基类,不需要理解的逻辑部分交给子类实现,比如冒泡排序。(其实不一定用继承,可以用组合),注意防止滥用。 STRATEGY模式 相比TEMPLATE METHOD,更好的解除了具体实现和算法的耦合,使用接口+组合,而不是继承,能提高具体实现的复用性,优先使用。 统一对外接口,隐藏策略的模式 FACADE模式 封装组件对外的策略和约束

设计模式@第18章:访问者模式

巧了我就是萌 提交于 2020-01-10 22:59:23
第18章:访问者模式 一、测评系统的需求 完成测评系统需求 将观众分为男人和女人,对歌手进行测评,当看完某个歌手表演后,得到他们对该歌手不同的评价(评价 有不同的种类,比如 成功、失败 等) 传统方案 二、传统方式的问题分析 如果系统比较小,还是 ok 的,但是考虑系统增加越来越多新的功能时,对代码改动较大,违反了 ocp 原则, 不利于维护 扩展性不好,比如 增加了 新的人员类型,或者管理方法,都不好做 引出我们会使用新的设计模式 – 访问者 模式 三、访问者模式基本介绍 访问者模式(Visitor Pattern),封装一些作用于某种数据结构的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。 主要将数据结构与数据操作分离,解决 数据结构和操作耦合性问题 访问者模式的基本工作原理是:在被访问的类里面加一个对外提供接待访问者的接口 访问者模式主要应用场景是:需要对一个对象结构中的对象进行很多不同操作(这些操作彼此没有关联),同时 需要避免让这些操作"污染"这些对象的类,可以选用访问者模式解决 四、访问者模式的原理类图 对原理类图的说明-即(访问者模式的角色及职责) Visitor 是抽象访问者,为该对象结构中的 ConcreteElement 的每一个类声明一个 visit 操作; ConcreteVisitor :是一个具体的访问者, 实现每个由

GOF 23设计模式之(行为型模式二)

北城以北 提交于 2020-01-07 12:41:54
目录 1.中介者模式 2.迭代器模式 3.访问者模式 4.备忘录模式 5.解析器模式 一、中介者模式(Mediator)   定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,可以独立地改变他们之间的交互。又叫调停模式,是迪米特法则的典型应用。      核心角色:   (1)抽象中介者角色(Mediator):提供同事对象注册与转发同事对象信息的抽象方法。   (2)具体中介者角色(Concrete Mediator):实现中介者接口,定义一个List来管理同事对象,协调各个同事角色之间的交互关系,因此依赖于同事角色。   (3)抽象同事类角色(Colleague):定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。   (4)具体同事类角色(Concrete Colleague):抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。   优点:   (1)降低对象之间的耦合性,使得对象易于独立地被复用。   (2)将对象间的一对多关联,转变为一对一的关联,提高系统的灵活性。      缺点:   (1)当同事类太多,中介者的职责将很大,会变得复杂而庞大,系统难于维护。    public class textMediator { public static void main

访问者在 Java 中的实现

被刻印的时光 ゝ 提交于 2020-01-06 14:39:32
访问者 是一种行为设计模式, 允许你在不修改已有代码的情况下向已有类层次结构中增加新的行为。 在 Java 中使用模式 复杂度: ⭐⭐⭐ 流行度: ⭐ 使用示例: 访问者不是常用的设计模式, 因为它不仅复杂, 应用范围也比较狭窄。 这里是 Java 程序库代码中该模式的一些示例: javax.lang.model.element.AnnotationValue 和 Annotation­Value­Visitor javax.lang.model.element.Element 和 Element­Visitor javax.lang.model.type.TypeMirror 和 Type­Visitor java.nio.file.FileVisitor 和 Simple­File­Visitor javax.faces.component.visit.VisitContext 和 Visit­Callback 将形状导出为 XML 文件 在本例中, 我们希望将一系列几何形状导出为 XML 文件。 重点在于我们不希望直接修改形状代码, 或者至少能确保最小程度的修改。 最终, 访问者模式建立了一个框架, 允许我们在不修改已有类的情况下向形状层次结构中添加新的行为。 shapes shapes/Shape.java: 通用形状接口 package refactoring_guru

设计模式22——Visitor设计模式

孤者浪人 提交于 2019-12-27 17:36:49
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Visitor访问者设计模式是在不修改已有程序结构的前提下,通过添加额外的“访问者”来完成对已有代码功能的提升。 Visitor访问者设计模式的角色: (1) 访问者角色(Visitor):声明一个访问接口。接口的名称和方法的参数标识了向访问者发送请求的元素角色。这样访问者就可以通过该元素角色的特定接口直接访问它。 (2) 具体访问者角色(Concrete Visitor):实现访问者角色(Visitor)接口 (3)元素角色(Element):定义一个Accept操作,它以一个访问者为参数。 (4) 具体元素角色(Concrete Element):实现元素角色(Element)接口。 (5) 对象结构角色(Object Structure):具体元素的集合,提供一个高层的接口允许访问者角色访问它的元素。 Visitor访问者设计模式结构如下: Visitor访问者设计模式例子代码如下: //抽象元素 interface IElement{ public void accept(IVisitor visitor); } //具体元素 class ElementA implements IElement{ public void accept(IVisitor visitor){ visitor.visit

【鲁班学院】设计模式—访问者(Visitor)模式

老子叫甜甜 提交于 2019-12-27 16:55:37
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 一、定义 访问者模式是一种从操作的对象结构中分离算法的方式。 它可以在不改变数据结构的前提下定义作用与这些元素的新操作。它遵循开闭原则。 > Represent an operation to be performed on elements of an object > structure. Visitor lets you define a new operation without changing > the classes of the elements on which it operates .visitor: n. 访问者,参观者;视察者. 二、涉及角色 1.Visitor 抽象访问者角色,为该对象结构中具体元素角色声明一个访问操作接口。该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色,这样访问者就可以通过该元素角色的特定接口直接访问它。 2.ConcreteVisitor.具体访问者角色,实现Visitor声明的接口。 3.Element 定义一个接受访问操作(accept()),它以一个访问者(Visitor)作为参数。 4.ConcreteElement具体元素,实现了抽象元素(Element)所定义的接受操作接口。 5.ObjectStructure结构对象角色

男人和女人 访问者模式

↘锁芯ラ 提交于 2019-12-24 01:12:30
28.1 男人和女人 28.2 最简单的编程实现 namespace 访问者模式 { class Program { static void Main(string[] args) { Console.WriteLine("男人成功时,背后多半有一个伟大的女人。"); Console.WriteLine("女人成功时,背后大多有一个不成功的男人。"); Console.WriteLine("男人失败时,闷头喝酒,谁也不用劝。"); Console.WriteLine("女人失败时,眼泪汪汪,谁也劝不了。"); Console.WriteLine("男人恋爱时,凡事不懂也要装懂。"); Console.WriteLine("女人恋爱时,遇事懂也装作不懂。"); Console.Read(); } } } View Code 28.3 简单的面向对象实现 namespace 访问者模式 { class Program { static void Main(string[] args) { List<Person> persons = new List<Person>(); Person man1 = new Man(); man1.Action = "成功"; persons.Add(man1); Person woman1 = new Woman(); woman1.Action =