天天看點

Java單體應用 - 架構模式 - 03.設計模式-25.通路者模式通路者模式

原文位址: http://www.work100.net/training/monolithic-architecture-design-patterns-visitor-pattern.html 更多教程: 光束雲 - 免費課程

通路者模式

序号 文内章節 視訊
1 概述 -
2 實作

請參照如上

章節導航

進行閱讀

1.概述

在通路者模式(

Visitor Pattern

)中,我們使用了一個通路者類,它改變了元素類的執行算法。

通過這種方式,元素的執行算法可以随着通路者改變而改變。

這種類型的設計模式屬于行為型模式。

根據模式,元素對象已接受通路者對象,這樣通路者對象就可以處理元素對象上的操作。

意圖:

主要将資料結構與資料操作分離。

主要解決:

穩定的資料結構和易變的操作耦合問題。

何時使用:

需要對一個對象結構中的對象進行很多不同的并且不相關的操作,而需要避免讓這些操作"污染"這些對象的類,使用通路者模式将這些封裝到類中。

如何解決:

在被通路的類裡面加一個對外提供接待通路者的接口。

關鍵代碼:

在資料基礎類裡面有一個方法接受通路者,将自身引用傳入通路者。

應用執行個體:

您在朋友家做客,您是通路者,朋友接受您的通路,您通過朋友的描述,然後對朋友的描述做出一個判斷,這就是通路者模式。

優點:

  • 符合單一職責原則。
  • 優秀的擴充性。
  • 靈活性。

缺點:

  • 具體元素對通路者公布細節,違反了迪米特原則。
  • 具體元素變更比較困難。
  • 違反了依賴倒置原則,依賴了具體類,沒有依賴抽象。

使用場景:

  • 對象結構中對象對應的類很少改變,但經常需要在此對象結構上定義新的操作。
  • 需要對一個對象結構中的對象進行很多不同的并且不相關的操作,而需要避免讓這些操作"污染"這些對象的類,也不希望在增加新操作時修改這些類。

注意事項:

通路者可以對功能進行統一,可以做報表、UI、攔截器與過濾器。

2.實作

我們将建立一個定義接受操作的

ComputerPart

接口。

Keyboard

Mouse

Monitor

Computer

是實作了

ComputerPart

接口的實體類。

我們将定義另一個接口

ComputerPartVisitor

,它定義了通路者類的操作。

Computer

使用實體通路者來執行相應的動作。

VisitorPatternDemo

,我們的示範類使用

Computer

ComputerPartVisitor

類來示範通路者模式的用法。

步驟 1

定義一個表示元素的接口。

ComputerPart.java

,代碼如下:

public interface ComputerPart {
   void accept(ComputerPartVisitor computerPartVisitor);
}           

步驟 2

建立擴充了上述類的實體類。

Keyboard.java

public class Keyboard  implements ComputerPart {
 
   @Override
   public void accept(ComputerPartVisitor computerPartVisitor) {
      computerPartVisitor.visit(this);
   }
}           

Monitor.java

public class Monitor  implements ComputerPart {
 
   @Override
   public void accept(ComputerPartVisitor computerPartVisitor) {
      computerPartVisitor.visit(this);
   }
}           

Mouse.java

public class Mouse  implements ComputerPart {
 
   @Override
   public void accept(ComputerPartVisitor computerPartVisitor) {
      computerPartVisitor.visit(this);
   }
}           

Computer.java

public class Computer implements ComputerPart {
   
   ComputerPart[] parts;
 
   public Computer(){
      parts = new ComputerPart[] {new Mouse(), new Keyboard(), new Monitor()};      
   } 
 
 
   @Override
   public void accept(ComputerPartVisitor computerPartVisitor) {
      for (int i = 0; i < parts.length; i++) {
         parts[i].accept(computerPartVisitor);
      }
      computerPartVisitor.visit(this);
   }
}           

步驟 3

定義一個表示通路者的接口。

ComputerPartVisitor.java

public interface ComputerPartVisitor {
   public void visit(Computer computer);
   public void visit(Mouse mouse);
   public void visit(Keyboard keyboard);
   public void visit(Monitor monitor);
}           

步驟 4

建立實作了上述類的實體通路者。

ComputerPartDisplayVisitor.java

public class ComputerPartDisplayVisitor implements ComputerPartVisitor {
 
   @Override
   public void visit(Computer computer) {
      System.out.println("Displaying Computer.");
   }
 
   @Override
   public void visit(Mouse mouse) {
      System.out.println("Displaying Mouse.");
   }
 
   @Override
   public void visit(Keyboard keyboard) {
      System.out.println("Displaying Keyboard.");
   }
 
   @Override
   public void visit(Monitor monitor) {
      System.out.println("Displaying Monitor.");
   }
}           

步驟 5

使用

ComputerPartDisplayVisitor

來顯示

Computer

的組成部分。

VisitorPatternDemo.java

public class VisitorPatternDemo {
   public static void main(String[] args) {
 
      ComputerPart computer = new Computer();
      computer.accept(new ComputerPartDisplayVisitor());
   }
}           

步驟 6

執行程式,輸出結果:

Displaying Mouse.
Displaying Keyboard.
Displaying Monitor.
Displaying Computer.           

上一篇:

模闆模式
如果對課程内容感興趣,可以掃碼關注我們的

公衆号

QQ群

,及時關注我們的課程更新
Java單體應用 - 架構模式 - 03.設計模式-25.通路者模式通路者模式
Java單體應用 - 架構模式 - 03.設計模式-25.通路者模式通路者模式