访问者模式

来源:互联网 发布:mac 登陆outlook365 编辑:程序博客网 时间:2024/05/01 23:46
/*
 * 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);
}