模式角色与结构:

示例代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace CSharp.DesignPattern.VisitorPattern
{
class Program
{
static void Main(string[] args)
{
ObjectStructure list = new ObjectStructure();
list.AddEmployee(new FulltimeEmployee("Mike", ));
list.AddEmployee(new FulltimeEmployee("Tony", ));
list.AddEmployee(new ParttimeEmployee("Nancen", ));
list.AddEmployee(new ParttimeEmployee("Bibo", )); FinanceVisitor fVisitor = new FinanceVisitor();
HrVisitor hVisitor = new HrVisitor(); list.Accept(fVisitor);
list.Accept(hVisitor);
}
} class ObjectStructure
{
public void Accept(Visitor visitor)
{
foreach (IEmployee element in employees)
{
element.Accept(visitor);
}
} public void AddEmployee(IEmployee employee)
{
employees.Add(employee);
} public void RemoveEmployee(IEmployee employee)
{
employees.Remove(employee);
} private List<IEmployee> employees = new List<IEmployee>();
} class Visitor
{
public abstract void Visit(FulltimeEmployee fulltime);
public abstract void Visit(ParttimeEmployee contract);
} class FinanceVisitor : Visitor
{
public void Visit(FulltimeEmployee fulltime)
{
Console.Write("The wage of fulltime is ...");
}
public void Visit(ParttimeEmployee contract)
{
Console.Write("The wage of parttime is ...");
}
} class HrVisitor : Visitor
{
public void Visit(FulltimeEmployee fulltime)
{
Console.Write("The worktime of fulltime is ...");
Console.Write("The overtime of fulltime is ...");
Console.Write("The timeoff of fulltime is ...");
}
public void Visit(ParttimeEmployee contract)
{
Console.Write("The worktime of fulltime is ...");
}
} interface IEmployee
{
public void Accept(Visitor visitor)
{ } String Name { set; get; }
Int32 Wage { set; get; }
} class FulltimeEmployee : IEmployee
{
public FulltimeEmployee(String name, Int32 wage)
{
this._name = name;
this._wage = wage;
} public void Accept(Visitor visitor)
{
visitor.Visit(this);
} public void OperationFulltime()
{ } public string Name
{
get { return _name; }
set { _name = value; }
} public int Wage
{
get { return _wage; }
set { _wage = value; }
} private String _name;
private Int32 _wage;
} class ParttimeEmployee : IEmployee
{
public ParttimeEmployee(String name, Int32 wage)
{
this._name = name;
this._wage = wage;
} public void Accept(Visitor visitor)
{
visitor.Visit(this);
} public void OperationParttime()
{ } public string Name
{
get { return _name; }
set { _name = value; }
} public int Wage
{
get { return _wage; }
set { _wage = value; }
} private String _name;
private Int32 _wage;
}
}

CSharp设计模式读书笔记(24):访问者模式(学习难度:★★★★☆,使用频率:★☆☆☆☆)的更多相关文章

  1. Head First 设计模式读书笔记(1)-策略模式

    一.策略模式的定义 策略模式定义了算法族,分别封装起来,让它们之间可以互换替换,此模式让算法的变化独立使用算法的客户. 二.使用策略模式的一个例子 2.1引出问题 某公司做了一套模拟鸭子的游戏:该游戏 ...

  2. CSharp设计模式读书笔记(23):模板方法模式(学习难度:★★☆☆☆,使用频率:★★★☆☆)

    模板方法模式:定义一个操作中算法的框架,而将一些步骤延迟到子类中.模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 模式角色与结构: 实现代码: using System; ...

  3. CSharp设计模式读书笔记(22):策略模式(学习难度:★☆☆☆☆,使用频率:★★★★☆)

    策略模式(Strategy Pattern):定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy). 模式角色与结构: ...

  4. CSharp设计模式读书笔记(21):状态模式(学习难度:★★★☆☆,使用频率:★★★☆☆)

    模式角色与结构: 示例代码:(本示例在具体状态类中实现状态切换,也可以在环境类中实现状态切换.状态模式一定程度上违背开闭原则) using System; using System.Collectio ...

  5. CSharp设计模式读书笔记(18):中介者模式(学习难度:★★★☆☆,使用频率:★★☆☆☆)

    中介者模式(Mediator Pattern):用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互,中介者模式又称为 ...

  6. CSharp设计模式读书笔记(17):迭代器模式(学习难度:★★★☆☆,使用频率:★★★★★)

    迭代器模式(Iterator Pattern):提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor). 模式角色与结构: 实现代码: using System; us ...

  7. CSharp设计模式读书笔记(15):命令模式(学习难度:★★★☆☆,使用频率:★★★★☆)

    命令模式(Command Pattern):将一个请求封装为一个对象,从而让我们可用不同的请求对客户进行参数化:对请求排队或者记录请求日志,以及支持可撤销的操作.命令模式是一种对象行为型模式,其别名为 ...

  8. CSharp设计模式读书笔记(14):职责链模式(学习难度:★★★☆☆,使用频率:★★☆☆☆)

    职责链模式(Chain of Responsibility  Pattern):避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象 ...

  9. CSharp设计模式读书笔记(13):代理模式(学习难度:★★★☆☆,使用频率:★★★★☆)

    代理模式:给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问. 模式角色与结构: 示例代码: using System; using System.Collections.Generi ...

随机推荐

  1. 在线maven 仓库

    findmaven.net是一个查找Jar和查找Maven的Maven仓库搜索引擎.它能够依据Java开发人员提供的Class名或者Jar名找到包括它的Jar,同一时候提供Jar的Maven仓库链接, ...

  2. freemarker错误九

    1.错误叙述性说明 五月 30, 2014 11:52:04 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严重: Template p ...

  3. c++学籍管理系统v1.10

    //////////////新增添加学生和成绩录入系统 #include<iostream> #include <string> #include<conio.h> ...

  4. SPPS java 创template

    最近写信给学校一个部门java plug for spss. 当加到变量超过70个月,然后保存,SPSS它会在错误的地方报. 解决方案: 每添加70提交变量. 版权声明:本文博主原创文章.博客,未经同 ...

  5. IBatis.net初步使用

    最近加班比较忙,时间也比较琐碎,蛮久没有写东西了.这次就总结一下自己使用IBatis.net的一些总结吧. IBatis简介 IBatis.net是一款开源的Orm框架,应该算是从java的IBati ...

  6. Java中关于OOM的场景及解决方法(转)

    http://developer.51cto.com/art/201112/305696.htm 1.OOM for Heap=>例如:java.lang.OutOfMemoryError: J ...

  7. ueditor使用注意事项

    1.js问题的介绍 第一ueditor型材 <script type="text/javascript" src="ueditor1_4_3-utf8-jsp/ue ...

  8. HSV 量化

    function L=hsvquan(hsv) %对HSV量化,该3维特征矢量: h=hsv(:,:,1); s=hsv(:,:,2); v=hsv(:,:,3); % 假设对HSV 空间进行适当的量 ...

  9. Linux进程管理(-)

    一.进程的类型 能够将执行在Linux系统中的进程分为三种不同的类型: 交互进程:由一个Shell启动的进程.交互进程既能够在前台执行,也能够在后台   执行. 批处理进程:不与特定的终端相关联,提交 ...

  10. ASP.NET Core官方资料入口

    ASP.NET 5 has been renamed to ASP.NET Core 1.0 传送门