abstract class Action {
public abstract void GetManConclusion(Man m);
public abstract void GetWomanConclusion(Woman w);
}
abstract class Person {
public abstract void Accept(Action visitor);
}
class Success : Action {
public override GetManConclusion(Man m){
Console.WriteLine("{0}{1}时,背后多半有一个伟大的女人",m.GetType().Name,this.GetType().Name);
}
public override GetWomanConclusion(Woman w){
Console.WriteLine("{0}{1}时,背后大多有一个不成功的男人",w.GetType().Name,this.GetType().Name);
}
}
class Failing : Action {
//与上面代码类似,略
}
class Man : Person {
public override void Accept(Action visitor) {
//双分派
visitor.GetManConclusion(this);
}
}
class Woman : Person {
public override void Accept(Action visitor) {
//双分派
visitor.GetWomanConclusion(this);
}
}
这里用到了双分派技术,意味着得到执行的操作决定于请求的种类和两个接收者的类型,接受方法就是一个双分派的操作,它得到执行的操作不仅决定于状态类的具体状态,还决定于访问的人的类别。
能枚举它的元素
对象结构类
class ObjectStructure {
private IList<Person> e = new List<Person>();
public void Attach(Person p){
e.Add(p);
}
public void Detach(Person p){
e.Remove(e);
}
public void Display(Action a) {
foreach(Person p in e){
p.Accept(a);
}
}
}
static void Main(string[]args){
ObjectStructure o = new ObjectStructure();
o.Attach(new Man());
o.Attach(new Woman());
Success v1 = new Success();
o.Display(v1);
Failing v2 = new Failing();
o.Display(v2);
Amativeness v3 = new Amativeness();
o.Display(v3);
}
表示一个作用于某对象结构中的各元素的操作,它可以使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作
访问者模式基本代码
abstract class Visitor {
public abstract void VisitConcreteElementA(ConcreteElementA c1);
public abstract void VisitConcreteElementB(ConcreteElementB c2);
}
class ConcreteVisitor : Visitor {
public override void VisitConcreteElementA(ConcreteElementA c1){
Console.WriteLine("{0}被{1}访问",c1.GetType().Name,this.GetType().Name);
}
public override void VisitConcreteElementB(ConcreteElementB c2){
Console.WriteLine("{0}被{1}访问",c2.GetType().Name,this.GetType().Name);
}
}
}
abstract class Element {
public abstract void Accept(Visitor visitor);
}
class ConcreteElementA : ElementA{
public override void Accept(Visitor v) {
v.VisitConcreteElement(this);
}
public void OperationA(){}
}
class ConcreteElementB : Element {
public override void Accept(Visitor v) {
v.VisitConcreteElementB(this);
}
public void OperationB(){}
}
这个模式不容易使用,尽量避免,