/*
* 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 arraylist myemployees;
private employee dleader;
public department(){
myemployees=new arraylist();
public string departname{
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);
public class employee:ivisitable
{
public employee(){}
public string name{
v.visitemployee(this);
public class namevisitor:visitor
public namevisitor(){}
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;}
detail=string.empty;
detail+=c.companyname+" ";
detail+="共有"+c.departments.count.tostring()+"个部门";
//base.visitcompany(c);
detail+=c.departname+" ";
detail+="共有"+c.employee.count+"个员工";
detail+="领导是"+c.leader.name;
detail+="员工的姓名是"+e.name;
}
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);
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){
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);