访问者模式

/*
 * User: Administrator
 * Date: 2007-7-3 Time: 10:26
 */
using System;
using System.Collections;

namespace TreeViewVisitable
{
    public interface IVisitable{
        void Accept (Visitor v);
    }

    public abstract class Visitor{
        public Visitor(){}
        public abstract void VisitCompany(Company c);
        public abstract void VisitDepartment(Department c);
        public abstract void VisitEmployee(Employee e);
    }

    public class Company:IVisitable{
        private string name;
        private ArrayList myDepartments;

        public Company(){
            myDepartments=new ArrayList();
        }

        public ArrayList Departments{
            get{return myDepartments;}
        }

        public string CompanyName{
            get{return name;}
            set{name=value;}
        }

        #region IVisitalbe 成员
        public void Accept(Visitor v){
            v.VisitCompany(this);
        }
        #endregion
    }
    public class Department:IVisitable{
        private string name;
        private ArrayList myEmployees;
        private Employee dLeader;

        public Department(){
            myEmployees=new ArrayList();
        }
        public string DepartName{
            get{return name;}
            set{name=value;}
        }

        public Employee Leader
        {
            get{return dLeader;}
            set{dLeader=value;}
        }

        public ArrayList Employee
        {
            get{return myEmployees;}
            set{myEmployees=value;}
        }

        #region IVisitable 成员
        public void Accept(Visitor v)
        {
            v.VisitDepartment(this);
        }
        #endregion
    }

    public class Employee:IVisitable
    {
        public Employee(){}
        private string name;

        public string Name{
            get{return name;}
            set{name=value;}
        }
        #region IVisitable 成员
        public void Accept(Visitor v){
            v.VisitEmployee(this);
        }
        #endregion

    }

    public class NameVisitor:Visitor
    {
        public NameVisitor(){}
        private string name;
        public string Name{get{return name;}}
        public override void VisitCompany(Company c)
        {
            name=c.CompanyName;
        }
        public override void VisitDepartment(Department c)
        {
            name=c.DepartName;
            //base.VisitDepartment(c);
        }
        public override void VisitEmployee(Employee e)
        {
            name=e.Name;
            //base.VisitEmployee(e);
        }
    }

    public class DetailVisitor:Visitor{
        public DetailVisitor(){}

        private string detail;
        public string Detail
        {
            get{return detail;}
        }

        public override void VisitCompany(Company c)
        {
            detail=string.Empty;
            detail+=c.CompanyName+" ";
            detail+="共有"+c.Departments.Count.ToString()+"个部门";
            //base.VisitCompany(c);
        }

        public override void VisitDepartment(Department c)
        {
            detail=string.Empty;
            detail+=c.DepartName+" ";
            detail+="共有"+c.Employee.Count+"个员工";
            detail+="领导是"+c.Leader.Name;
            //base.VisitDepartment(c);
        }

        public override void VisitEmployee(Employee e)
        {
            detail=string.Empty;
            detail+="员工的姓名是"+e.Name;
            //base.VisitEmployee(e);
        }

    }

}

private ArrayList dp=new ArrayList();
private NameVisitor nv=new NameVisitor();
private DetailVisitor dv=new DetailVisitor();
void Button1Click(object sender, EventArgs e)
{
try
{

    Company  c=new Company();

    c.CompanyName="测试公司";

    Department d=new Department();
    d.DepartName="软件部";
    Employee e1=new Employee();
    e1.Name="佳艺";

    d.Leader=e1;
    d.Employee.Add(e);

    Employee e2=new Employee();
    e2.Name="e2";
    d.Employee.Add(e2);

    Employee e3=new Employee();
    e3.Name="e3";
    d.Employee.Add(e3);

    c.Departments.Add(d);

    dp.Add(c);
    ShowCompanies();

    }
catch(Exception ex)
{
    MessageBox.Show(ex.ToString());
}
}

private void ShowCompanies()
{
    foreach(Company c in dp)
    {
        c.Accept(nv);
        string name=nv.Name;
        TreeNode n=treeView1.Nodes.Add(name);
        n.Tag=c;
        ShowDepartments(c,n);
    }
}

private void ShowDepartments(Company c ,TreeNode on)
{
    foreach(Department d in c.Departments){
        d.Accept(nv);
        string name=nv.Name;
        TreeNode n=on.Nodes.Add(name);
        n.Tag=d;
        ShowEmployee(d,n);
    }
}

private void ShowEmployee(Department d,TreeNode n)
{
    foreach(Employee e in d.Employee){
        d.Accept(nv);
        string name=nv.Name;
        TreeNode on=n.Nodes.Add(name);
        on.Tag=e;
    }
}

void TreeView1AfterSelect(object sender, TreeViewEventArgs e)
{
    IVisitable cde=(IVisitable)e.Node.Tag;
    cde.Accept(dv);
    MessageBox.Show(dv.Detail);
}

 

时间: 2024-10-01 20:14:34

访问者模式的相关文章

设计模式之访问者模式

        刚刚学完设计模式的访问者模式(编译器模式),这里就对该模式进行了总结与分析. 一.产生原因         这里存在一个这样的问题:如果某系统已经完成了一个类层次并提供了满足需求的所有接口,现在要增加新的需求,我们需要怎么做?         可能你会采用增加该需求并把整个层次结构统统修改一遍.然而如果需求变动会不停的发生,而且需求的任何变动都会让整个结构统统修改一遍,此时你会怎么做呢?        所以,我们现在需要对这个系统结构进行重构,访问者模式也许就是你解决上面问题最好

php设计模式 Visitor 访问者模式

复制代码 代码如下:<?php /** * 访问者模式 * * 表示一个作用于某对象结构中的各元素的操作,可以在不改变各元素的类的前提下定义作用于这些元素的新操作 * */ abstract class Visitor { abstract public function visitCroncreteElementA($element); abstract public function visitCroncreteElementB($element); } class ConcreteVisi

设计模式学习笔记(二十)—Visitor访问者模式

Visitor模式定义: 表示一个作用于某对象结构中各元素的操作.它可以使你不修改各元素类的前提下定义作用于这些元素的新操作,也就是动态的增加新的方法. Visitor模式结构图: Visitor模式中主要角色: 1)访问者角色(Visitor):为该对象结构(ObjectStructure)中的具体元素提供一个访问操作接口.该操作接口的名字和参数标识了要访问的具体元素角色.这样访问者就可以通过该元素角色的特定接口直接访问它. 2)具体访问者角色(ConcreteVisitor):实现Visto

深入浅出Java的访问者模式

一.引子 对于系统中一个已经完成的类层次结构,我们已经给它提供了满足需求的接口.但是面对新增加的需求,我们应该怎么做呢?如果这是为数不多的几次变动,而且你不用为了一个需求的调整而将整个类层次结构统统地修改一遍,那么直接在原有类层次结构上修改也许是个 不错 的主意. 但是往往我们遇到的却是:这样的需求变动也许会不停的发生:更重要的是需求的任何变动可能都要让你将整个类层次结构修改个底朝天--.这种类似的操作分布在不同的类里面,不是一个好现象,我们要对这个结构重构一下了. 那么,访问者模式也许是你很好

.Net设计模式实例之访问者模式(Visitor Pattern)

一.访问者模式简介(Brief Introduction) 表示一个作用于某对象结构中的元素操作.它使你可以在不改变各元素类的前提下定义 作用于这些元素的新操作,它把数据结构和作用于结构上的操作之间的耦合性解脱开,使的 操作结合可以相对自由地演化.优点是增加新的操作很容易,因为增加一个新的操作就意味 着增加一个新的访问者,访问者模式将有关的行为集中到一个访问对象中. 二.解决的问题(What To Solve) 访问者模式的目的是要把处理从数据结构分离出来.如果系统有比较稳定的数据结构, 又有易

设计模式之四:访问者模式

目录介绍 1.访问者模式介绍 2.访问者模式定义 3.访问者模式UML图 4.访问者模式简单案例 5.访问者模式之Android源码分析 5.1 注解简单介绍 5.2 注解与访问者模式关系 5.3 注解与性能的关系 6.访问者模式之实践 6.1 介绍 6.2 编译期注解之ButterKnife 6.3 编译期注解之Dagger2 6.4 自己写个简单支持View的ID注入的工具 6.4.0 基本逻辑思路 7.注解之ButterKnife源码分析 7.0 简单工作流程 7.1 首先看看Bind注解

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

特此说明:对访问者模式理解不是特别透彻,若有误,请指正,谢谢! 1.概述 在软件开发过程中,对于系统中的某些对象,它们存储在同一个集合collection中,且具有不同的类型,而且对于该集合中的对象,可以接受一类称为访问者的对象来访问,而且不同的访问者其访问方式有所不同. 例子1:顾客在超市中将选择的商品,如苹果.图书等放在购物车中,然后到收银员处付款.在购物过程中,顾客需要对这些商品进行访问,以便确认这些商品的质量,之后收银员计算价格时也需要访问购物车内顾客所选择的商品. 此时,购物车作为一个

对象-请问各位,我这样理解访问者模式正确吗,一个简单的例子

问题描述 请问各位,我这样理解访问者模式正确吗,一个简单的例子 package test; public class Client{ //数据对象二 顾客 public static void main(String[] args) { //当顾客进饭店吃饭,他不会直接跟厨师打交道, //1.饭店主要是炒菜,这时,厨师会炒很多菜 但是不知道炒哪个菜, 厨房与顾客 不具备炒菜的功能, //所以炒菜可以是厨师的功能,但是需要一个中间人来告诉厨师炒什么菜,那么我们就定义一个菜单,相当于访问者,访问厨师

Java设计模式(二十一)----访问者模式

访问者模式 一.概述 1.定义 2.分派的概念 3.分派的类型 4.双重分派 二.结构 三.具体案例 一.概述 1.定义 访问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变. 2.分派的概念 变量被声明时的类型叫做变量的静态类型(Static Type),有些人又把静态类型叫做明显类型(Apparent Type):而变量所引用的对象的真实类型又叫做变量的实际类型(Actual Type).比如: List list = n

适配器模式之访问者模式

设计模式目录 http://blog.csdn.net/fenglailea/article/details/52733435 风.fox 访问者模式 封装一些作用于某种数据结构中的各个元素的操作,他可以在不改变数据结构的前提下定义作用于这些元素的新的操作 通用类图 组成 抽象访问者 Vistor 抽象接口或类,声明访问者可以访问那些元素,具体到程序中就是Visit方法的参数定义那些对象时可以被访问的 具体访问者 ConcreteVistor 它影响访问者访问到一个类后该怎么干,要做什么事情 抽