天天看点

访问者模式

/*

 * 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);

上一篇: 桥接模式
下一篇: 命令模式

继续阅读