说明:比如一开始有3个是执行Print方法,后来改需求了,要加多个时间显示,就需要3个都修改,加上访问者,客户端是由访问者去执行这3个类的方法。客户端无需改变代码。
实现:
public abstract class ABS_Element { public abstract void Accept(IVistor v); public abstract void Print(); } public class ElementA : ABS_Element { public override void Accept(IVistor v) { //调用访问者 } public override void Print() { //由访问者类来执行的方法 } } public class ElementB : ABS_Element { public override void Accept(IVistor v) { //调用访问者 } public override void Print() { //由访问者执行的方法 } } public interface IVistor { //几个访问者类,加几个。 void View(ElementA a); void View(ElementB b); } /// <summary> /// 访问者类 /// </summary> public class Vistor : IVistor { public void View(ElementA a) { a.Print(); } public void View(ElementB b) { b.Print(); } } /// <summary> /// 我的 /// </summary> public class MyList { private ArrayList eleList = new ArrayList(); public ArrayList lists { get { return eleList; } } public void action() { foreach(ABS_Element e in eleList) { e.Accept(new Vistor()); } } } public class test { public void start() { //将节点添加进集合 MyList obj1 = new MyList(); obj1.lists.Add(new ElementA()); obj1.lists.Add(new ElementA()); obj1.lists.Add(new ElementB()); //开始访问 obj1.action(); } }