访问者模式以及代码应用 缺乏、安全感 2021-08-11 11:52 237阅读 0赞 ![5057999-cc2693ed042bc2c6.png][] 先看一个最小化的表述 **vistor 访问者 通过不同element作为参数,实现不同的方法** **Element 被访问者 其模式是固定的,都是accept(vistor)中,以自己为参数,回调vistor中对应的方法。其重点就在于element本身的传递.** **我认为,当element多样化 且适合作为封闭的个体时 需要单独维护时候 适合用访问者模式。** /** * 最小化的表述 * vistor 访问者 通过不同element作为参数,实现不同的方法 * Element 被访问者 其模式是固定的,都是accept(vistor)中,以自己为参数,回调vistor中对应的方法。其重点就在于element本身的传递. * 当element多样化 且适合作为封闭的个体时 需要单独维护时候 适合用访问者模式。 */ class VisitorA { public void visit(){ System.out.println("我是A"); } public void visit(ElementB b){ System.out.println("我是B"); } public void visit(ElementC c){ System.out.println("我是C"); } } class ElementB { public void accept(VisitorA vistor){ vistor.visit(this); } } class ElementC { public void accept(VisitorA vistor){ vistor.visit(this); } } @Test public void testMin(){ VisitorA visitor = new VisitorA(); ElementB b = new ElementB(); b.accept(visitor); ElementC c = new ElementC(); c.accept(visitor); } 下面是一个更为具体的实现 比如车 简单分为 车轮,引擎,车身 这些属于不同element,被访问者 当我们需要单独维护这些组件时候,比如说他们有一些仅属于自己的特性时候,可以通过访问者模式来实现需要的功能 比如下文举例中,金额的计算,类型的打印 通过对每一个不同的element,以vistor入参执行accept方法,在element的accept方法中,将自己本身作为入参,回调对应vistor接口中的实现方法,达到不同效果的实现 public class VisitorPattern { interface Visitor { void visit(Wheel wheel); void visit(Engine engine); void visit(Body body); } class Wheel extends Element { void accept(Visitor visitor) { visitor.visit(this); } } abstract class Element { int price; void accept(Visitor visitor) { } } class Engine extends Element { void accept(Visitor visitor) { visitor.visit(this); } } class Body extends Element { void accept(Visitor visitor) { visitor.visit(this); } } class PrintVisitor implements Visitor { public void visit(Wheel wheel) { System.out.println("Visiting wheel"); } public void visit(Engine engine) { System.out.println("Visiting engine"); } public void visit(Body body) { System.out.println("Visiting body"); } } /** * 计算金额访问者,实现金额设置计算的功能 */ class CalcVisitor implements Visitor { public void visit(Wheel wheel) { wheel.price = 100; } public void visit(Engine engine) { engine.price =200; } public void visit(Body body) { body.price = 300; } } @Test public void test() { PrintVisitor visitor = new PrintVisitor(); Enforcer enforcer = new Enforcer(new Wheel(), new Engine(), new Body()); enforcer.visitAll(visitor); } @Test public void testCalMoney() { CalcVisitor visitor = new CalcVisitor(); Enforcer enforcer = new Enforcer(new Wheel(), new Engine(), new Body()); enforcer.visitAll(visitor); enforcer.calcalateAll(); } /** * 执行者 */ class Enforcer { private List<Element> elementList = new ArrayList<>(); Enforcer(Wheel wheel, Engine engine, Body body) { elementList.add(wheel); elementList.add(engine); elementList.add(body); } /** * 通过以vistor为入参,遍历组件的accept方法,来实现访问所有的组件 * * @param visitor */ public void visitAll(Visitor visitor) { for (Element element : elementList) { element.accept(visitor); } } public void calcalateAll(){ int price= 0; for(Element e : elementList){ price += e.price; } System.out.println(price); } } } 我认为的使用场景: 1. 每一个被访者都有需要单独维护的地方,需要进行封装 2. 对于每个被访问者,都可以抽象出对应的计算规则/逻辑 项目中的应用: 在一些财务的结算项目中,有收入、利润、总利润等等很多不同的方面,同时每个的方面又有很多不同的计算规则需要保存。这个时候可以用访问者模式,将这些不同方面作为element,在vistor实现中,再取element中的不同规则,实现不同的计算逻辑。 [5057999-cc2693ed042bc2c6.png]: /images/20210811/fbfb1eeccfe24220b1570d16ccfe7bf5.png
相关 java 访问者模式_设计模式之访问者模式 public interface Visitor \{ public void visitString(StringElement stringE); public voi 今天药忘吃喽~/ 2022年11月05日 15:55/ 0 赞/ 225 阅读
相关 访问者模式 一、前言 `能力,是你前行的最大保障` 年龄会不断的增长,但是什么才能让你不慌张。一定是能力,即使是在一个看似还很安稳的工作中也是一样,只有拥有`能留下的本事`和`跳出 喜欢ヅ旅行/ 2022年10月17日 10:36/ 0 赞/ 177 阅读
相关 访问者模式 include <iostream> include <list> include <string> using namespace std; 川长思鸟来/ 2022年09月24日 11:25/ 0 赞/ 145 阅读
相关 访问者模式 1.使用场景: 在一个集合中有一些不同的子类对象,需要分别对这些子类对象做处理。常常应用于XML文档的解析、编辑器的解析等。 2.UML表示: 2.1 Visit 比眉伴天荒/ 2022年05月31日 09:27/ 0 赞/ 212 阅读
相关 访问者模式 提供一个访问者对象,这个对象可以通过传入的不同类调用不同方法 像这样: function accept(foo $foo){ $method="visit" ╰半橙微兮°/ 2021年12月21日 00:59/ 0 赞/ 221 阅读
相关 访问者模式 前言 访问者模式(Visitor),表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变元素的类的前提下定义作用于这些元素的新操作。 一、状态抽象类和人的 妖狐艹你老母/ 2021年12月09日 00:55/ 0 赞/ 261 阅读
相关 访问者模式 推荐文章:[https://www.cnblogs.com/edisonchou/p/7247990.html][https_www.cnblogs.com_edisoncho 小灰灰/ 2021年11月11日 02:28/ 0 赞/ 260 阅读
相关 访问者模式 21.访问者模式 ![70][] public abstract class Element { public abst 刺骨的言语ヽ痛彻心扉/ 2021年09月17日 00:08/ 0 赞/ 407 阅读
相关 访问者模式以及代码应用 ![5057999-cc2693ed042bc2c6.png][] 先看一个最小化的表述 vistor 访问者 通过不同element作为参数,实现不同的方法 Ele 缺乏、安全感/ 2021年08月11日 11:52/ 0 赞/ 237 阅读
相关 访问者模式 一 点睛 定义 封装一些作用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下定义作用于这些元素的新的操作。 二 结构 访问者模式包含以下主要角 电玩女神/ 2021年07月24日 16:40/ 0 赞/ 389 阅读
还没有评论,来说两句吧...