访问者模式-2

接  3.5 访问者模式(5.11)

访问者模式的核心是解决a.foo(b)的双分派问题。所以还是给出一个简单的例子。好人打贱人。好人有南拳、北腿类,贱人有鬼子、棒子、B2等。

访问者模式中客户Test会创建各种各样的对象,只调用一个方法 ”好人"的 打(贱人 j) 方法。

/**
 *
 * @author yqj2065
 * @version 2014.9
 */
public abstract class 好人{
    //测试目标 好人 .打(贱人),应该能够找到2*3个方法体
    public abstract void 打(贱人 j);
    abstract void 打JP();
    abstract void 打Bar();
    abstract void 打B2();
}
abstract class 贱人{
    public abstract void cmd(好人 x);// Command
}

按照采用的技术不同,好人中可以使用重载(程序中就需要用instanceof)、可以使用不同方法名(本例采用的方式)——这些方法由贱人们调用,Test不需要知道,所以采用默认访问控制。注意:不同于Gof,visitXx()中没有参数

关键点:不同于GoF,Visitor为客户提供了一个统一的访问接口 打(贱人 j) 

贱人之所以贱,在GoF中它的方法名不是command而是accept。这个方法的目的是将重载的打(贱人 j) 方法区分开来,转换成 x.打JP()等。

import static tool.Print.*;

public class 南拳 extends 好人{
    @Override public void 打(贱人 j){
        j.cmd(this);
    }
    @Override void 打JP(){  pln("南拳.打JP()"); }
    @Override void 打Bar(){ pln("南拳.打Bar()");}
    @Override void 打B2(){  pln("南拳.打B2()"); }
}
class JP extends 贱人{
    @Override public void cmd(好人 x){//命令
        x.打JP();
    }
}//其他的北腿、棒子、B2 略

测试:

    public static void test访问者(){
        好人 m1 = (好人)God.create("3-30-q");//南拳对象
        好人 m2 = (好人)God.create("3-30-t");//北腿对象
        贱人 a = (贱人)God.create("3-30-jp");
        贱人 b = (贱人)God.create("3-30-bar");
        贱人 c = (贱人)God.create("3-30-b2");
        // x .打(y);
        m1.打(a);
        m1.打(b);
        m1.打(c);
        m2.打(a);
        m2.打(b);
        m2.打(c);
    }

输出:

南拳.打JP()

南拳.打Bar()

南拳.打B2()

北腿.打JP()

北腿.打Bar()

北腿.打B2()

现在,好人中增加刀客类,按照南拳的样子写一个。测试代码创建一个刀客对象m3,m3.打(a);m3.打(b);m3.打(c);

输出:

南拳.打JP()....

北腿.打B2()

刀客.打JP()

刀客.打Bar()

刀客.打B2()

与抽象工厂类似,增加一个好人的子类很方便;增加一个贱人的子类,好人的类层次都需要修改。

如果愿意,也可以用一个ArrayList把贱人对象放进去,把贱人叫作Element,JP是具体的元素...

这就是访问者模式的基本内容。

时间: 2024-12-25 14:52:47

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

访问者模式

在阎宏博士的<JAVA与模式>一书中开头是这样描述访问者(Visitor)模式的: 访问者模式是对象的行为模式.访问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变.从定义可以看出结构对象是使用访问者模式的必备条件,而且这个结构对象必须存在遍历自身各个对象的方法 访问者模式结构: 访问者角色(Visitor): 为该对象结构中具体元素角色声明一个访问操作接口. 具体访问者角色(Concrete Visitor): 实现每个由

那些开发中用到的模式——访问者模式

为了尽可能演示出Visitor 设计模式的强大之处,在此举一个开发中的场景例如 开发A组 负责做log功能,而B组需要A组暴露一个API,可以拿到所有的log. A组的代码实现可能是如下这样的: public abstract class OrderLog{ public string Content {get;set;} public OrderLog(string content){ Content = content; } } public class PlaceOrderLog :Ord

Android学习之访问者模式详解

本文和大家分享的主要是android设计模式中的访问者模式相关内容,一起来看看吧,希望对大家学习android有所帮助. 访问者模式 访问者模式属于行为模式. 访问者模式中属于相对比较复杂的一类,它会在A中让B访问,而实际在B中实际调用的是A的方法. class A { public void method1(){ System.out.println("AAAAAA"); } public void method2(B b){ b.showA(this); } } class B {

大话设计模式读书笔记--23.访问者模式

定义 访问者模式定义: 表示一个作用于某对象结构中的各元素的操作,它使你在不改变各元素的类的前提下,定义作用于这些元素的新操作 把数据结构, 和作用于数据结构上的操作,分离 模式结构 代码实现 场景: 男人和女人谈恋爱,男人的状态和女人的状态 代码实现:点击下载 特点和使用场景 优点:很容易增加新的操作 缺点: 使增加新的数据结构变得困难 使用场景: 数据结构相对稳定的系统

【设计模式】访问者模式

在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法.通过这种方式,元素的执行算法可以随着访问者改变而改变.这种类型的设计模式属于行为型模式.根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作. 介绍 意图:主要将数据结构与数据操作分离. 主要解决:稳定的数据结构和易变的操作耦合问题. 何时使用:需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,使用访问者模式将这些

访问者模式(Visitor Pattern)

访问者模式:使用一个访问者类,改变元素的行为.通过这种方式,随着访问者的改变,被访问者的行为可以被改变. 类图: 实现Master接口的具体类是行为需要被改变的对象. 实现Visitor接口的具体类是访问者,访问者不同,实现Master接口的具体类的行为不同. public interface Master { public abstract String getName(); } public class ConcreteMaster implements Master { private S

(转)访问者模式

原文:http://blog.csdn.net/zhengzhb/article/details/7489639 定义:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作. 类型:行为类模式 类图: 访问者模式可能是行为类模式中最复杂的一种模式了,但是这不能成为我们不去掌握它的理由.我们首先来看一个简单的例子,代码如下: [java] view plaincopy class A { public void method1(){ System.o

设计模式----访问者模式

?定义:表示一个作用于某对象结构中的歌元素的操作,可以使你在不改变个元素的类的前提下定义作用于这些元素的操作. 当需要扩展一个已有类的层次结构时,我们一般只需要简单增加一些方法来扩展的行为,会出现已有对象和需要扩展的行为不一致的情况,这种情况下不修改层次结构中的类就无法扩展其行为.访问者模式可以解决这个问题. 1.Visitor 抽象访问者角色,为该对象结构中具体元素角色声明一个访问操作接口.该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色,这样访问者就可以通过该元素角色的特定

JAVA设计模式之 访问者模式【Visitor Pattern】

一.概述 访问者模式是一种较为复杂的行为型设计模式,它包含访问者和被访问元素两个主要组成部分,这些被访问的元素通常具有不同的类型,且不同的访问者可以对它们进行不同的访问操作.在使用访问者模式时,被访问元素通常不是单独存在的,它们存储在一个集合中,这个集合被称为"对象结构",访问者通过遍历对象结构实现对其中存储的元素的逐个操作.访问者模式是一种对象行为型模式. 二.适用场景 当有多种类型的访问者(或是操作者) 对一组被访问者对象集合(或是对象结构)进行操作(其中对象集合也包含多种类型对象

访问者模式-Visitor

访问者模式:表示作用于某对象结构的个元素的操作.它使你在不改变各元素的类的前提下定义作用于这些元素的新操作. 访问者模式的适用场景:有比较稳定的数据结构,又有易于变化的算法的话,使用反复问这模式就是比较合适的,因为访问者模式使得算法操作的增加变得容易. 访问者模式的优缺点: 优点:增加新的操作容易,因为增加新的操作就意味着增加一个新的访问者.访问者模式将有关的行为集中到一个访问者对象中. 缺点:访问者模式使得增加新的数据结构变得苦难了. 访问者模式结构图: 代码实现: 1 package com