CSharp设计模式读书笔记(24):访问者模式(学习难度:★★★★☆,使用频率:★☆☆☆☆)
模式角色与结构:

示例代码:
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):访问者模式(学习难度:★★★★☆,使用频率:★☆☆☆☆)的更多相关文章
- Head First 设计模式读书笔记(1)-策略模式
一.策略模式的定义 策略模式定义了算法族,分别封装起来,让它们之间可以互换替换,此模式让算法的变化独立使用算法的客户. 二.使用策略模式的一个例子 2.1引出问题 某公司做了一套模拟鸭子的游戏:该游戏 ...
- CSharp设计模式读书笔记(23):模板方法模式(学习难度:★★☆☆☆,使用频率:★★★☆☆)
模板方法模式:定义一个操作中算法的框架,而将一些步骤延迟到子类中.模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 模式角色与结构: 实现代码: using System; ...
- CSharp设计模式读书笔记(22):策略模式(学习难度:★☆☆☆☆,使用频率:★★★★☆)
策略模式(Strategy Pattern):定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy). 模式角色与结构: ...
- CSharp设计模式读书笔记(21):状态模式(学习难度:★★★☆☆,使用频率:★★★☆☆)
模式角色与结构: 示例代码:(本示例在具体状态类中实现状态切换,也可以在环境类中实现状态切换.状态模式一定程度上违背开闭原则) using System; using System.Collectio ...
- CSharp设计模式读书笔记(18):中介者模式(学习难度:★★★☆☆,使用频率:★★☆☆☆)
中介者模式(Mediator Pattern):用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互,中介者模式又称为 ...
- CSharp设计模式读书笔记(17):迭代器模式(学习难度:★★★☆☆,使用频率:★★★★★)
迭代器模式(Iterator Pattern):提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor). 模式角色与结构: 实现代码: using System; us ...
- CSharp设计模式读书笔记(15):命令模式(学习难度:★★★☆☆,使用频率:★★★★☆)
命令模式(Command Pattern):将一个请求封装为一个对象,从而让我们可用不同的请求对客户进行参数化:对请求排队或者记录请求日志,以及支持可撤销的操作.命令模式是一种对象行为型模式,其别名为 ...
- CSharp设计模式读书笔记(14):职责链模式(学习难度:★★★☆☆,使用频率:★★☆☆☆)
职责链模式(Chain of Responsibility Pattern):避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象 ...
- CSharp设计模式读书笔记(13):代理模式(学习难度:★★★☆☆,使用频率:★★★★☆)
代理模式:给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问. 模式角色与结构: 示例代码: using System; using System.Collections.Generi ...
随机推荐
- 【DataStructure】Some useful methods about linkedList(三)
Method 4: Gets the value of element number i For example, if list is {22, 33, 44, 55, 66, 77, 88, 99 ...
- ios 多线程开发(一)简介
简介 线程是在一个程序中并发的执行代码的方法之一.虽然有一些新的技术(operations, GCD)提供了更先进高效的并发实现,OS X和iOS同时也提供了创建和维护线程的接口. 这里将要介绍线程相 ...
- Objective C Runtime 开发介绍
简介 Objective c 语言尽可能的把决定从编译推迟到链接到运行时.只要可能,它就会动态的处理事情.这就意味着它不仅仅需要一个编译器,也需要一个运行时系统来执行变异好的代码.运行时系统就好像是O ...
- HSQLDB相关信息及用法汇总
运行模式 说明 启动命令 JDBC例 内存(Memory-Only)模式 所有数据都在内存里操作.应用程序退出后则数据被销毁.无需另外启动HSQLDB Server 启动方式1:通过程序中首次调用Co ...
- Vertica: 基于DBMS架构的列存储数据仓库
介绍 Vertica(属于HP公司),是一个基于DBMS架构的数据库系统,适合读密集的分析型数据库应用,比方数据仓库,白皮书中全名称为VerticaAnalytic Database.从命名中也可以看 ...
- 在Sql中使用Try Catch
原文:在Sql中使用Try Catch 今天在写sql中出现了!我想在sql使用trycatch吧! 哎..但是语法又记不住了! 那就清楚我们的google大师吧! 嘿,网上关于在sql中使用Try ...
- Integer比较
/** * @time 2014-06-25 * @author Cao HaiCheng * */ public class demo { public static void main(Strin ...
- UML部署图和图九组件图
前言 UML大部分描写叙述了逻辑和设计方面的信息.实现图用来描写叙述实现方面的信息.实现图包含部署图和构件图. 构件图 1. 概念 构件图从软件架构的角度来描写叙述一个系统的 ...
- Chapter06-Phylogenetic Trees Inherited(POJ 2414)(减少国家DP)
Phylogenetic Trees Inherited Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 480 Accepted ...
- Java拾遗(一):浅析Java子类和父类的实例化顺序 及 陷阱
本文主要介绍Java里经常使用的子类和父类的变量实例化顺序及陷阱,并结合一个Android实例来探讨此问题.日后编程中应尽量避免此陷阱. 首先看以下一段代码: 定义一个虚类Server.java pa ...