定  义:表示作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

结构图:

示例:

状态类:

  1. //状态的抽象类
  2. abstract class Action
  3. {
  4. public abstract void GetManConclusion(Man concreteElementA); //得到男人的结论或反应
  5.  
  6. public abstract void GetWomanConclusion(Woman concreteElementB); //得到女人的结论或反应
  7. }
  8.  
  9. //成功 状态
  10. class Success : Action
  11. {
  12. public override void GetManConclusion(Man concreteElementA)
  13. {
  14. Console.WriteLine("{0}{1}时,多半有个伟大的女人", concreteElementA.GetType().Name, this.GetType().Name);
  15. }
  16.  
  17. public override void GetWomanConclusion(Woman concreteElementB)
  18. {
  19. Console.WriteLine("{0}{1}时,肯定有个不成功的男人", concreteElementB.GetType().Name, this.GetType().Name);
  20. }
  21. }
  22.  
  23. //失败 状态
  24. class Failing : Action
  25. {
  26. public override void GetManConclusion(Man concreteElementA)
  27. {
  28. Console.WriteLine("{0}{1}时,闷头喝酒,谁也不用劝", concreteElementA.GetType().Name, this.GetType().Name);
  29. }
  30.  
  31. public override void GetWomanConclusion(Woman concreteElementB)
  32. {
  33. Console.WriteLine("{0}{1}时,眼泪汪汪,谁也劝不了", concreteElementB.GetType().Name, this.GetType().Name);
  34. }
  35. }

人,男人,女人:

  1. //"人"的抽象类
  2. abstract class Person1
  3. {
  4. public abstract void Accept(Action visitor); //接受,用来获得状态对象
  5. }
  6.  
  7. //男人
  8. class Man : Person1
  9. {
  10. public override void Accept(Action visitor)
  11. {
  12. visitor.GetManConclusion(this);
  13. }
  14. }
  15.  
  16. //女人
  17. class Woman : Person1
  18. {
  19. public override void Accept(Action visitor)
  20. {
  21. visitor.GetWomanConclusion(this);
  22. }
  23. }

对象结构类:

  1. //对象结构
  2. class ObjectStructure
  3. {
  4. public IList<Person1> persons = new List<Person1>();
  5.  
  6. //增加
  7. public void Attach(Person1 person)
  8. {
  9. persons.Add(person);
  10. }
  11.  
  12. //移除
  13. public void Detach(Person1 person)
  14. {
  15. persons.Remove(person);
  16. }
  17.  
  18. //查看显示
  19. public void Display(Action visitor)
  20. {
  21. foreach (Person1 person in persons)
  22. {
  23. person.Accept(visitor);
  24. }
  25. }
  26. }

客户端调用:

  1. ObjectStructure o = new ObjectStructure();
  2. //对象结构中加入要对比的“男人”和“女人”
  3. o.Attach(new Man());
  4. o.Attach(new Woman());
  5.  
  6. //成功时的反应
  7. Success v1 = new Success();
  8. o.Display(v1);
  9.  
  10. //失败时的时的反应
  11. Failing v2 = new Failing();
  12. o.Display(v2);
  13.  
  14. //结婚时的反应
  15. //Marry v3 = new Marry();
  16. //o.Display(v3);

结果:

设计模式:访问者模式(Visitor)的更多相关文章

  1. 设计模式 -- 访问者模式(Visitor)

    写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------主要内容包括: 初识访问者模 ...

  2. C#设计模式——访问者模式(Visitor Pattern)

    一.概述由于需求的改变,某些类常常需要增加新的功能,但由于种种原因这些类层次必须保持稳定,不允许开发人员随意修改.对此,访问者模式可以在不更改类层次结构的前提下透明的为各个类动态添加新的功能.二.访问 ...

  3. 大话设计模式--访问者模式 Visitor -- C++实现实例

    1. 访问者模式: 表示一个作用于某对象结构中的和元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 访问者模式把数据结构和作用于结构上的操作之间的耦合脱开,使得操作集合可以 ...

  4. 深入浅出设计模式——访问者模式(Visitor Pattern)

    模式动机 对于系统中的某些对象,它们存储在同一个集合中,且具有不同的类型,而且对于该集合中的对象,可以接受一类称为访问者的对象来访问,而且不同的访问者其访问方式有所不同,访问者模式为解决这类问题而诞生 ...

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

    设计模式 ( 二十 ) 访问者模式Visitor(对象行为型) 1.概述 在软件开发过程中,对于系统中的某些对象,它们存储在同一个集合collection中,且具有不同的类型,而且对于该集合中的对象, ...

  6. 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern)

    原文:乐在其中设计模式(C#) - 访问者模式(Visitor Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern) 作者:webabc ...

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

    访问者模式 Visitor    <侠客行>是当代作家金庸创作的长篇武侠小说,新版电视剧<侠客行>中,开篇有一段独白:  “茫茫海外,传说有座侠客岛,岛上赏善罚恶二使,每隔十年 ...

  8. 二十四种设计模式:访问者模式(Visitor Pattern)

    访问者模式(Visitor Pattern) 介绍表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 示例有一个Message实体类,某些对象对 ...

  9. .NET设计模式访问者模式

    一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该 ...

  10. JAVA 设计模式 访问者模式

    用途 访问者模式 (Visitor) 表示一个作用于某对象结构中的各元素的操作. 它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 访问者模式是一种行为型模式. 用途

随机推荐

  1. 最短路(Floyd_Warshall) POJ 2253 Frogger

    题目传送门 /* 最短路:Floyd算法模板题 */ #include <cstdio> #include <iostream> #include <algorithm& ...

  2. onclientclick和onclick区别

    OnClientClick是客户端脚本,一般使用javascript,在客户端,也就是IE中运行,点击后马上执行OnClick是服务器端事件处理函数,使用C#或者vb.net,在服务器端,也就是IIS ...

  3. 转盘游戏[XDU1006]

    Problem 1006 - 转盘游戏 Time Limit: 1000MS   Memory Limit: 65536KB   Difficulty: Total Submit: 87  Accep ...

  4. HDU 2853 & 剩余系+KM模板

    题意: 给你一张二分图,给一个原匹配,求原匹配改动最少的边数使其边权和最大. SOL: 我觉得我的智商还是去搞搞文化课吧..这种题给我独立做我大概只能在暴力优化上下功夫.. 这题的处理方法让我想到了剩 ...

  5. 【BZOJ】1601: [Usaco2008 Oct]灌水(kruskal)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1601 很水的题,但是一开始我看成最短路了T_T 果断错. 我们想,要求连通,对,连通!连通的价值最小 ...

  6. [ZT] 酒店大洗脑:最全各大国际酒店集团族谱图

    原文地址: http://www.licai.com/yuedu/201411-62884.html 如果你对各大耳熟能详的国际酒店管理集团还有什么问题,相信今天和你分享的各大酒店集团家族系谱图和最全 ...

  7. Odoo 二次开发教程【一】 Odoo 的安装

    一,安装的两种方式: 1) deb包安装: 此安装方式适用于简单不需要太多的人工干预,大多数插件都在deb中涵盖了.具体的步骤如下: 1.编辑 /etc/apt/source.list 文件,在末尾添 ...

  8. String数组转List,List转String数组

    引入自: http://blog.csdn.net/aaronuu/article/details/7055650 List 转换为 String数组 List<String> list  ...

  9. JAVA架构师要求

    JAVA架构师要求专业素质要求:1.理解架构师的职责和架构设计的目标.原则及取舍:2.精通架构模式,Transaction.Security.Persistence等机制及实现,IOC.AOP.SOA ...

  10. DS实验题 order

    算法与数据结构 实验题 6.4 order ★实验任务 给出一棵二叉树的中序遍历和每个节点的父节点,求这棵二叉树的先序和后序遍历. ★数据输入 输入第一行为一个正整数n表示二叉树的节点数目,节点编号从 ...