一位記者做街頭訪問的節目並贈送禮物,如果採訪的是女性送一朵玫瑰花男的送一隻鋼筆。
戰爭是男人的事讓女人走開。
模式定義:訪問者模式即表示一個作用於某對象結構中的各元素的操作,它使我們可以在不改變各元素的類的前提下定義作用於這些元素的新操作。
案例說明:案例中男人和女人這兩種元素是穩定的,記者(訪問者)對不同的性別(穩定的數據)送出了不同的禮物(操作)。
戰爭是男人的事讓女人走開,戰爭是一個訪問者,對男人和女人這兩組元素有着不同的操作,男人蔘加戰爭女人遠離戰爭。
優點:在不改變元素下,解耦操作,拓展操作
注意:使用時應考慮元素的穩定性(一般是元素的個數),元素變化所有的訪問者都要改動。 元素上的操作是否頻繁可變。
代碼:首先定義抽象類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);
}
}
結果佐爲獲得了一隻鋼筆
雪莉獲得了一束玫瑰
佐爲參加戰爭
雪梨遠離戰爭