表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
适用场景适用于数据结构相对稳定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。
目的把处理从数据结构分离处理。如果系统有比较稳定的数据结构,又有易于变化的算法,使用访问者模式是比较合适的,因为访问者模式使得状态操作的增加变得容易。
优点加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行为集中到一个访问者对象中。
缺点使得增加新的数据结构变得困难。
UML 用例男人和女人的区别
状态的抽象类:
abstract class Action{
//得到男人结论或反应
public abstract void getManConclusion(Man concreteElementA);
//得到女人结论或反应
public abstract void getMomanConclusion(Woman concreteElementB);
}
人的抽象类
abstract class Person{
//接受
public abstract void accept(Action action);
}
状态的具体类
//成功
class Success extends Action{
@override
public void getManConclusion(Man concreteElementA){
System.out.println(concreteElementA.getType().Name + this.getType().Name + “时,背后多半有一个伟大的女人”
}
@override
public void getWomanConclusion(Woman concreteElementB){
System.out.println(concreteElementA.getType().Name + this.getType().Name + “时,背后多半有一个不成功的男人”);
}
}
//失败
class Failing extends Action{
//与上面代码同类,省略
}
//恋爱
class Emotiveness extends Action{
//与上面代码类似,省略
}
男人类和女人类
//男人
class Man extends Person{
@override
public void accept(Action action){
action. getManConclusion(this);//双分派技术
}
}
//女人
class Woman extends Person{
@override
public void accept(Action action){
action. getManConclusion(this);
}
}
对象结构
class ObjectStructure{
private IList elements = new List();
//增加
public void attach(Person element) {
element.Add(element);
}
//移除
public void detach(Person element){
element.Remove(element);
}
//查看
public void display(Action action);{
foreach(Person e in elements){
e.Accept(action);
}
}
}
客户端
static void Main(string[] args){
ObjectStructure o = new ObjectStructure();
o.attach(new Man());
o.attach(new Woman());
//成功时的反应
Success v1 = new Success();
0.display(v1);
Failing v2 = new Failing();
0.display(v2);
Amativeness v3 = new Amativeness();
0.display(v1);
}
如果想增加一个婚姻状态,则只需要增加:
class Marriage:Action{
@override
public void getManConclusion(Man concreteElementA){
System.out.println(concreteElementA.getType().Name + this.getType().Name + “是感慨道:恋爱游戏结束时,‘有期徒刑’摇无期。”);
}
@override
public void getWomanConclusion(Woman concreteElementB) {
……
}
}



