1、什麼是訪問者模式測試
Visitor模式也叫訪問者模式,是行爲模式之一 ,它分離對象的數據和行爲,使用Visitor模式, 能夠不修改已有類的狀況下,增長新的操做。this
2、訪問者模式的應用示例spa
好比有一個公園,有一到多個不一樣的組成部分;該公 園存在多個訪問者:清潔工A負責打掃公園的A部分,清 潔工B負責打掃公園的B部分,公園的管理者負責檢點各 項事務是否完成,上級領導能夠視察公園等等。也就是 說,對於同一個公園,不一樣的訪問者有不一樣的行爲操 做,並且訪問者的種類也可能須要根據時間的推移而變 化(行爲的擴展性)。設計
根據軟件設計的開閉原則(對修改關閉,對擴展開 放),咱們怎麼樣實現這種需求呢?code
3、訪問者模式的結構對象
4、訪問者模式的角色和職責blog
1) 訪問者角色(Visitor): 爲該對象結構中具體元素角色聲明一個訪問操做接口。該操做接 口的名字和參數標識了發送訪問請求給具體訪問者的具體元素角色。 這樣訪問者就能夠經過該元素角色的特定接口直接訪問它。接口
2) 具體訪問者角色(Concrete Visitor): 實現每一個由訪問者角色(Visitor)聲明的操做。事務
3) 元素角色(Element): 定義一個Accept操做,它以一個訪問者爲參數。get
4) 具體元素角色(Concrete Element): 實現由元素角色提供的Accept操做。
5) 對象結構角色(Object Structure): 這是使用訪問者模式必備的角色。它要具有如下特徵:能枚舉 它的元素;能夠提供一個高層的接口以容許該訪問者訪問它的元 素;能夠是一個複合(組合模式)或是一個集合,如一個列表或一個無序 集合。
公園每一部分的抽象
1 // 公園每一部分的抽象 2 public interface ParkElement { 3 //用來接納訪問者 4 public void accept(Visitor visitor); 5 }
公園
1 //公園 2 public class Park implements ParkElement { 3 private String name; 4 private ParkA parkA; 5 private ParkB parkB; 6 7 public Park() { 8 this.parkA = new ParkA(); 9 this.parkB = new ParkB(); 10 parkA.setName("A"); 11 parkB.setName("B"); 12 } 13 14 public void accept(Visitor visitor) { 15 visitor.visit(this); 16 parkA.accept(visitor); 17 parkB.accept(visitor); 18 19 } 20 21 public String getName() { 22 return name; 23 } 24 25 public void setName(String name) { 26 this.name = name; 27 } 28 }
公園的A部分
1 // 公園的A部分 2 public class ParkA implements ParkElement { 3 private String name; 4 5 public String getName() { 6 return name; 7 } 8 9 public void setName(String name) { 10 this.name = name; 11 } 12 13 public void accept(Visitor visitor) { 14 visitor.visit(this); 15 } 16 }
公園的B部分
1 // 公園的B部分 2 public class ParkB implements ParkElement{ 3 private String name; 4 5 public String getName() { 6 return name; 7 } 8 9 public void setName(String name) { 10 this.name = name; 11 } 12 13 public void accept(Visitor visitor) { 14 visitor.visit(this); 15 } 16 }
訪問者
1 // 訪問者 2 public interface Visitor { 3 public void visit(Park park); 4 public void visit(ParkA parkA); 5 public void visit(ParkB parkB); 6 }
清潔工A,負責parkA的衛生狀況
1 // 清潔工A,負責parkA的衛生狀況 2 public class VisitorA implements Visitor { 3 4 public void visit(Park park) { 5 6 } 7 8 public void visit(ParkA parkA) { 9 System.out.println("清潔工A:完成公園" + parkA.getName()+ "的衛生"); 10 } 11 12 public void visit(ParkB parkB) { 13 14 } 15 }
清潔工B,負責公園B部分的衛生
1 // 清潔工B,負責公園B部分的衛生 2 public class VisitorB implements Visitor { 3 4 public void visit(Park park) { 5 6 } 7 8 public void visit(ParkA parkA) { 9 10 } 11 12 public void visit(ParkB parkB) { 13 System.out.println("清潔工B:完成公園" + parkB.getName()+"的衛生"); 14 } 15 }
管理員
1 //管理員 2 public class VisitorManager implements Visitor { 3 4 public void visit(Park park) { 5 System.out.println("管理員:負責" + park.getName() + "衛生檢查"); 6 } 7 8 public void visit(ParkA parkA) { 9 System.out.println("管理員:負責公園"+ parkA.getName() +"部分衛生檢查"); 10 } 11 12 public void visit(ParkB parkB) { 13 System.out.println("管理員:負責公園"+ parkB.getName() +"分部衛生檢查"); 14 } 15 }
測試
1 public class MainClass { 2 public static void main(String[] args) { 3 Park park = new Park(); 4 park.setName("越秀公園"); 5 VisitorA visitorA = new VisitorA(); 6 7 park.accept(visitorA); 8 9 VisitorB visitorB = new VisitorB(); 10 park.accept(visitorB); 11 12 VisitorManager visitorManager = new VisitorManager(); 13 park.accept(visitorManager); 14 } 15 }