一位记者做街头访问的节目并赠送礼物,如果采访的是女性送一朵玫瑰花男的送一只钢笔。
战争是男人的事让女人走开。
模式定义:访问者模式即表示一个作用于某对象结构中的各元素的操作,它使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
案例说明:案例中男人和女人这两种元素是稳定的,记者(访问者)对不同的性别(稳定的数据)送出了不同的礼物(操作)。
战争是男人的事让女人走开,战争是一个访问者,对男人和女人这两组元素有着不同的操作,男人参加战争女人远离战争。
优点:在不改变元素下,解耦操作,拓展操作
注意:使用时应考虑元素的稳定性(一般是元素的个数),元素变化所有的访问者都要改动。 元素上的操作是否频繁可变。
代码:首先定义抽象类human并接受访问者
public abstract class Human {
//名字
protected String name;
public Human(String name) {
this.name = name;
}
/**
* 接受访问者访问
* @param visitor
*/
public abstract void accept(Visitor visitor);
}
男人
public class Man extends Human{
public Man(String name) {
super(name);
}
@Override
public void accept(Visitor visitor) {
visitor.visitor(this);//关键代码 将自身引用传入访问者
}
}
女人
public class Woman extends Human {
public Woman(String name) {
super(name);
}
@Override
public void accept(Visitor visitor) {
visitor.visitor(this);//关键代码 将自身引用传入访问者
}
}
访问者
public interface Visitor {
//访问男人
void visitor(Man man);
//访问女人
void visitor(Woman woman);
}
记者(访问者)
public class ReporterVisitor implements Visitor{
@Override
public void visitor(Man man) {
System.out.println(man.name + "获得了一块钢笔");
}
@Override
public void visitor(Woman woman) {
System.out.println(woman.name + "获得了一束玫瑰");
}
}
战争(访问者)
public class WarVisitor implements Visitor {
@Override
public void visitor(Man man) {
System.out.println(man.name + "参加战争");
}
@Override
public void visitor(Woman woman) {
System.out.println(woman.name + "远离战争");
}
}
测试
public class Test {
public static void main(String args[]) {
//稳定的数据男人 女人
Man man = new Man("佐为");
Woman woman = new Woman("雪莉");
//记者访问者
Visitor reporterVisitor = new ReporterVisitor();
reporterVisitor.visitor(man);
reporterVisitor.visitor(woman);
//战争访问者
Visitor warVisitor = new WarVisitor();
warVisitor.visitor(man);
warVisitor.visitor(woman);
}
}
结果
佐为获得了一只钢笔
雪莉获得了一束玫瑰
佐为参加战争
雪梨远离战争