转自:http://www.techscore.com/tech/DesignPattern/Visitor.html

第13章では Visitor パターンを学びます。Visitor とは、英語で「訪問者」を意味します。Visitor パターンでは、「処理」を訪問者である Visitor オブジェクトに記述することで、処理の追加を簡単にします。処理対象となる、Acceptor オブジェクトは、Visitor オブジェクトを受け入れる accept(Visitor visitor)メソッドを実装している必要があります。

例えば、家の「水道工事」を行ってもらう場合、あなたは、「水道工事業者」を家に呼んで、「よろしくお願いします。」と言って、後は全てお 任せしますよね。同様に、「庭の手入れ」を行ってもらう場合は、「庭師」を家に呼んで、全てお任せしてしまうでしょう。そのほかにも、電気工事業者を呼ぶ ことも、リフォーム業者を呼ぶこともあるでしょう。これらの訪問者に対して、あなたは、「では、よろしく」と言って、ほとんどの作業をお任せするはずで す。

お任せの仕方に多少の違いがあるかもしれませんが、最終的には、全てを業者にお任せすることになると思います。もし、新しいサービスを提供 する業者が現れたときにも、各家庭は、なんら態度を変える必要が無く、その業者を呼んで、「よろしくお願いします。」というだけで、その新しいサービスを 受けることができます。

Visitor パターンでは、このように、受け入れる側に処理を追加することなく、処理を追加することができるパターンです。

サンプルケースでは、家庭訪問を例に考えて見ます。各家庭では、先生であろうと、近所のおばちゃんであろうと、訪問者が訪れると、知らない人でなければ、「いらっしゃい」と言って受け入れます。この際、各家庭を Acceptor 、先生を Visitor として、Visitor パターンに当てはめて考えて見ます。Visitor パターンでは、Visitor は、訪問対象となる、家庭を訪問します。訪問された家庭は、「ようこそいらっしゃいました」と先生を受けいれます。

さて、新人先生の小学校でも、秋の家庭訪問の時期がやってきました。新人先生も、初めての家庭訪問にどきどきしながら、各家庭を訪れました。

新人先生 こ・こ・こ・こんにちわ
親御さん

あら、いらっしゃい新人先生。
どうかなさいましたか?青い顔して・・・。

新人先生 い・・いえ、緊張して。
親御さん あら、先生ったらかわいい。

各家庭の親御さんたちは、新人先生がどきどきしているのをあざ笑うかのように冷静です。新人先生は、何で自分だけこんなにどぎまぎしているのだろうと不思議に思い、学校に帰ってベテラン先生に聞きました。

新人先生 ベテラン先生、家庭訪問したとき、なぜ親御さんたちは、すごく冷静ですね。
私は、なんだかどぎまぎしちゃって。
ベテラン先生 それは、当たり前だよ。
君は、自分の家に、誰か訪問してきたとき、そんなにどきどきするかい?
新人先生 いえ、人が訪問してくるのは別に
ベテラン先生

だよね。今回、初めての経験をしているのは、君だけで、 親御さんたちは、これまで何回も家庭訪問を受けている。 少なくとも、去年は受けているだろうし、もしかしたら、兄弟などを合わせると、 既に10回以上の家庭訪問を受けている方もおられるかも知れない。 親御さんたちは、これまで、先生方を受け入れてきたのと同じように、 君を受け入れているわけだね。 メソッドで表すと、 accept(Teacher teacher) となるだろうか。 このように、先生を受け入れるメソッドを既に持っている家庭は、 違う兄弟の家庭訪問や、違う先生の家庭訪問でも、 なんら別のメソッドを用意する必要がないわけですね。

新人先生

なるほど。
どの先生が来るかによって、いろいろとメソッドを用意していたら、
親御さんたちも大変ですよね。

さて、ではこの状況をクラスで表現してみましょう。

//先生クラス
public abstract class Teacher{
List students = null;
public abstract void visit(Home studentHome);
public abstract void visit(TanakaHome studentHome);
public abstract void visit(SuzukiHome studentHome);
public List getStudentList(){
return students;
}

}
//新人先生クラス
public class RookieTeacher extends Teacher{
List students = null;
public RookieTeacher(List students){
this.students = students;
}
public void visit(Home studentHome){
System.out.println("こんにちは");
}
public void visit(TanakaHome studentHome){
studentHome.praisedChild();
}
public void visit(SuzukiHome studentHome){
studentHome.reprovedChild();
}
}
//家庭クラス
public abstract class Home{
public abstract Object praisedChild();
public abstract Object reprovedChild();
}
//受け入れインタフェース
public interface TeacherAcceptor{
public void accept(Teacher teacher);
}
//鈴木さんの家庭
public class SuzukiHome extends Home implements TeacherAcceptor{
public Object praisedChild(){
System.out.println("あら、先生ったらご冗談を");
return new Tea();
}
public Object reprovedChild(){
System.out.println("うちの子に限ってそんなことは・・・。");

return null;
}
/**
* 訪問者を受け入れるメソッド
*/
public void accept(Teacher teacher){
teacher.visit(this);
}
}

新人先生を表す RookieTeacher クラスでは、visit メソッドがオーバーロードされており、訪問する家庭によって visit メソッドが選択されます。クラス図は、以下のようになります。

新しい先生が赴任してきた場合も、各家庭は、なんら変更を必要としませんね。

Visitor パターンの一般的なクラス図は以下のようになります。

Visitor パターン相关推荐

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

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  2. 设计模式模式游客(Visitor)摘录

    23种子GOF设计模式一般分为三类:创建模式.结构模型.行为模式. 创建模式抽象的实例,怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化托付给还 ...

  3. Design Pattern - Visitor(C#)

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Defi ...

  4. 设计模式学习笔记——访问者模式(VIsitor)

    1.特点:当Element较稳定.Visitor易增加时考虑.(朋友在精不在多) 2.概念:表示一个作用于某对象结构中的各个元素的操作.它使你可以在不改变各个元素的类的前提下定义作用于这些元素的新操作 ...

  5. 设计模式:访问者(Visitor)模式

    设计模式:访问者(Visitor)模式 一.前言    什么叫做访问,如果大家学过数据结构,对于这点就很清晰了,遍历就是访问的一般形式,单独读取一个元素进行相应的处理也叫作访问,读取到想要查看的内容+ ...

  6. 行为模式之Visitor模式

    1.意图 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作 2.适用性 (1)一个对象结构包含很多类对象,它们有不同的接口,而你想对这些实施一些 ...

  7. 设计模式之访问者(visitor)模式

    在患者就医时,医生会根据病情开具处方单,很多医院都会存在以下这个流程:划价人员拿到处方单之后根据药品名称和数量计算总价,而药房工作人员根据药品名称和数量准备药品,如下图所示. 在软件开发中,有时候也需 ...

  8. 设计模式(行为型模式)——访问者模式(Visitor)

    2019独角兽企业重金招聘Python工程师标准>>> 访问者模式把数据结构和作用于结构上的操作解耦合,使得操作集合可相对自由地演化.访问者模式适用于数据结构相对稳定算法又易变化的系 ...

  9. 设计模式:访问者模式(Visitor Pattern)

    访问者模式(Visitor Pattern): 封装一些作用于某种数据结构的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作. 主要将数据结构与数据操作分离,解决数据结构和操作 ...

  10. Visitor 访问者模式

    意图 表示一个作用于某对象结构的各个元素的操作,他可以在不改变各元素的前提下定义作用于这些元素的新的操作. public abstract class Shape { public abstract ...

最新文章

  1. 人工智能改善客户服务体验
  2. iOS 自动引用计数和内存泄露
  3. 面试官:你能告诉我一个请求过来,Spring MVC 是如何找到正确的 Controller 的?
  4. C++尽量在operater=中处理“自我赋值”
  5. 前端面试:你应该了解的JS算法相关的知识
  6. 【华为云技术分享】当我们在谈论卡片时,我们到底在谈论什么?
  7. web文件上传(三)--webapi后台接收参数和文件
  8. 考研编程练习---StringMatching(后缀表达式)
  9. 使用C语言--判断素数的两种方法
  10. 基于ROS的AGV运动控制与状态记录(维嵌科技)
  11. julia集 matlab代码,Mandelbrot集和Julia集的分形图之matlab实现.docx
  12. 文件上传(WebUploader)成功之前自定义裁剪(vue-img-cutter),上传裁剪的图片,并兼容ie
  13. GAMES101 13节 光线追踪 笔记
  14. VS Code, VS 2022 使用正则表达式进行替换
  15. Mifare UltraLight 卡存储结构
  16. B站投资,不务正业?
  17. 独眼龙夏侯惇为什么能两次打败巅峰时期的赵云,他到底有多厉害?
  18. 温度指示报警电路设计报告
  19. (JavaSE 学习记录)Java运算符
  20. 一首来自程序员的诗,祝所有的母亲节日快乐!

热门文章

  1. 音视频 SDP 添加码率
  2. skip connections
  3. 使用python+selenium发送QQ邮件
  4. 健康生活 多用肥皂少用洗涤剂
  5. Java中限定类名和非限定类名的区别
  6. 事务四大特性(ACID)原子性、一致性、隔离性、持久性
  7. 解决IIS+PHP出现的“500 - 内部服务器错误”
  8. jmeter设置永久中文和解决查看结果树响应中文乱码问题
  9. AutoJs学习-读取手机短信
  10. 微信小程序识别二维码功能