访问者模式-Visitor

访问者模式:表示作用于某对象结构的个元素的操作.它使你在不改变各元素的类的前提下定义作用于这些元素的新操作.

访问者模式的适用场景:有比较稳定的数据结构,又有易于变化的算法的话,使用反复问这模式就是比较合适的,因为访问者模式使得算法操作的增加变得容易.

访问者模式的优缺点:

  • 优点:增加新的操作容易,因为增加新的操作就意味着增加一个新的访问者.访问者模式将有关的行为集中到一个访问者对象中.
  • 缺点:访问者模式使得增加新的数据结构变得苦难了.

访问者模式结构图:

代码实现:

 1 package com.cgj.pattern.visitor;
 2
 3 /**
 4  * Visitor接口
 5  */
 6 public interface Action {
 7
 8     // 得到男人结论或反应
 9     public abstract void getManConclusion(Man concreteElement);
10
11     // 得到女人的结论或反应
12     public abstract void getWomanConclusion(Woman concreteElement);
13 }
 1 package com.cgj.pattern.visitor;
 2
 3 /**
 4  * Element接口:定义一个访问的方法,它以一个访问者为参数
 5  */
 6 public interface Person {
 7
 8     // 他是用来获得Visitor对象的
 9     public abstract void accept(Action visitor);
10 }
 1 package com.cgj.pattern.visitor;
 2
 3 /**
 4  * 具体的Element类
 5  */
 6 public class Man implements Person {
 7
 8     // visitor给出访问的结果
 9     @Override
10     public void accept(Action visitor) {
11         visitor.getManConclusion(this);
12     }
13
14 }
 1 package com.cgj.pattern.visitor;
 2
 3 /**
 4  * 具体的Element类
 5  */
 6 public class Woman implements Person {
 7
 8     // visitor给出访问的结果
 9     @Override
10     public void accept(Action visitor) {
11         visitor.getWomanConclusion(this);
12     }
13
14 }
 1 package com.cgj.pattern.visitor;
 2
 3 /**
 4  * 具体的访问者,实现每个由Visitor声明的操作.
 5  * 每个操作实现算法的一部分,而该算法片段乃是对应于结构中对象的类.
 6  */
 7 public class Success implements Action {
 8
 9     @Override
10     public void getManConclusion(Man concreteElement) {
11         System.out.println("男人成功时,背后多半有一个伟大的女人.");
12
13     }
14
15     @Override
16     public void getWomanConclusion(Woman concreteElement) {
17         System.out.println("女人成功时,背后大多有一个不成功的男人.");
18
19     }
20
21 }
 1 package com.cgj.pattern.visitor;
 2
 3 /**
 4  * 具体的访问者,实现每个由Visitor声明的操作.
 5  * 每个操作实现算法的一部分,而该算法片段乃是对应于结构中对象的类.
 6  */
 7 public class Failing implements Action {
 8
 9     @Override
10     public void getManConclusion(Man concreteElement) {
11         System.out.println("男人失败时,闷头喝酒谁也不用劝.");
12
13     }
14
15     @Override
16     public void getWomanConclusion(Woman concreteElement) {
17         System.out.println("女人失败时,眼泪汪汪,谁也劝不了.");
18
19     }
20
21 }
 1 package com.cgj.pattern.visitor;
 2
 3 /**
 4  * 具体的访问者,实现每个由Visitor声明的操作.
 5  * 每个操作实现算法的一部分,而该算法片段乃是对应于结构中对象的类.
 6  */
 7 public class Amativeness implements Action {
 8
 9     @Override
10     public void getManConclusion(Man concreteElement) {
11         System.out.println("男人恋爱时,凡是不懂也要装懂.");
12
13     }
14
15     @Override
16     public void getWomanConclusion(Woman concreteElement) {
17         System.out.println("女人恋爱时,遇事懂也装作不懂.");
18
19     }
20
21 }
 1 package com.cgj.pattern.visitor;
 2
 3 import java.util.ArrayList;
 4 import java.util.List;
 5
 6 /**
 7  * 能枚举它的元素,可以提供一个高层的接口以允许访问者访问他的元素.
 8  */
 9 public class ObjectStructure {
10
11     private List<Person> elements = new ArrayList<Person>();
12
13     public boolean add(Person element) {
14         return elements.add(element);
15     }
16
17     public boolean detach(Person element) {
18         return elements.remove(element);
19     }
20
21     // 枚举所有元素
22     public void display(Action visitor) {
23         for (Person element : elements) {
24             element.accept(visitor);
25         }
26     }
27 }
 1 package com.cgj.pattern.visitor;
 2
 3 /**
 4  * 首先在display函数中将具体的状态传递给Man类完成第一次分派,
 5  * 然后Man调用作为参数的状态类中的getManConslusion函数同时将自身
 6  * 作为参数传递进去,这便完成了第二次分派.
 7  */
 8 public class Test {
 9
10     public static void main(String[] args) {
11         ObjectStructure structure = new ObjectStructure();
12
13         structure.add(new Man());
14         structure.add(new Woman());
15
16         System.out.println("成功时的反应");
17         structure.display(new Success());
18
19         System.out.println("失败时的反应");
20         structure.display(new Failing());
21
22         System.out.println("恋爱时的反应");
23         structure.display(new Amativeness());
24     }
25
26 }

(本随笔参考了程杰老师的<<大话设计模式>>)

时间: 2024-11-10 01:19:13

访问者模式-Visitor的相关文章

设计模式入门之访问者模式Visitor

Set集合的配置 数据表的创建:表关系一个员工拥有多个身份 create table EMPLOYEE ( id INT NOT NULL auto_increment, first_name VARCHAR(20) default NULL, last_name VARCHAR(20) default NULL, salary INT default NULL, PRIMARY KEY (id) ); create table CERTIFICATE ( id INT NOT NULL aut

设计模式之访问者模式(Visitor)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

访问者模式 Visitor 行为型 设计模式(二十七)

访问者模式 Visitor <侠客行>是当代作家金庸创作的长篇武侠小说,新版电视剧<侠客行>中,开篇有一段独白: “茫茫海外,传说有座侠客岛,岛上赏善罚恶二使,每隔十年必到中原武林,向各大门派下发放赏善罚恶令, 强邀掌门人赴岛喝腊八粥,拒接令者,皆造屠戮,无一幸免,接令而去者,杳无音讯,生死未仆,侠客岛之行,已被视为死亡之旅.” 不过话说电视剧,我总是觉得老版的好看. 意图 表示一个作用于某对象结构中的各元素的操作. 它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作.

【设计模式】—— 访问者模式Visitor

对于某个对象或者一组对象,不同的访问者,产生的结果不同,执行操作也不同.此时,就是访问者模式的典型应用了. 应用场景 1 不同的子类,依赖于不同的其他对象 2 需要对一组对象,进行许多不相关的操作,又不想在类中是现在这些方法 3 定义的类很少改变,但是执行的操作却经常发生改变. 回到顶部 模式结构 Context 环境角色 class Context{ List<Node> list = new ArrayList(); public void add(Node node) { list.ad

设计模式 ( 二十 ) 访问者模式Visitor(对象行为型)

1.概述 在软件开发过程中,对于系统中的某些对象,它们存储在同一个集合collection中,且具有不同的类型,而且对于该集合中的对象,可以接受一类称为访问者的对象来访问,而且不同的访问者其访问方式有所不同. 例子1:顾客在超市中将选择的商品,如苹果.图书等放在购物车中,然后到收银员处付款.在购物过程中,顾客需要对这些商品进行访问,以便确认这些商品的质量,之后收银员计算价格时也需要访问购物车内顾客所选择的商品. 此时,购物车作为一个ObjectStructure(对象结构)用于存储各种类型的商品

学习笔记——访问者模式Visitor

访问者模式,通过Visitor的注入,为Element扩展了方法实现.虽然避免了Element不用修改即可修改,但却破坏了类的封装性,同时,一旦变更就需要增加子类,在子类方法中调用基类方法,然后再使用Visitor的方法来扩展. 个人理解,Visitor有点类似于策略模式中的算法,都是通过组合的方法变换原有实现.但访问者的变换粒度是具体函数内部要实现扩展,而策略模式主要是算法实现的替换.

设计模式(17) 访问者模式(VISITOR) C++实现

意图: 表示一个作用于某对象结构的各元素的操作.它使你可以再不改变各元素的类的前提下定义作用于这些元素的新操作. 动机: 之前在学校的最后一个小项目就是做一个编译器,当时使用的就是访问者模式. 在静态分析阶段,将源程序表示为一个抽象语法树,编译器需要在抽象语法树的基础上实施某些操作以进行静态语义分析.可能需要定义许多操作以进行类型检查.代码优化.流程分析.检查变量是否在使用前被赋值,等等. 这个需求的特点是:要求对不同的节点进行不同的处理. 常规设计方法:不同的节点封装不同的操作. 缺点是,节点

访问者模式 Visitor Pattern

访问者模式: 闻词达意,肯定有访问者(对象).接受者(对象).写个实例: 1.IVisitor 抽象访问者角色,声明一个访问操作接口visit(Acceptor ). 2.Visitor 具体访问者角色,实现IVisitor声明的接口. 3.Acceptor 定义一个被访问者,定义接受访问操作(accept(IVisitor)). 4.AcceptorInstance 被访问者实例,实现接受访问操作,然后同意(回调)访问者访问自己. 1 package headfirst.visitor; 2

[设计模式] 23 访问者模式 visitor Pattern

在GOF的<设计模式:可复用面向对象软件的基础>一书中对访问者模式是这样说的:表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作.访问者模式把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化.该模式的目的是要把处理从数据结构分离出来.访问者模式让增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者.访问者模式将有关的行为集中到一个访问者对象中.   初次接触,定义会显得晦涩并且难于理解,没关系,LZ来陪