24訪問者模式Visitor

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 }
相關文章
相關標籤/搜索