日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java中的访问者设计模式–示例教程

發布時間:2023/12/3 java 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java中的访问者设计模式–示例教程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

訪客模式行為設計模式之一 。 當我們必須對一組相似類型的對象執行操作時,將使用訪問者模式。 借助訪問者模式,我們可以將操作邏輯從對象移動到另一個類。

例如,假設有一個購物車,我們可以在其中添加不同類型的項目(元素),當我們單擊“結帳”按鈕時,它將計算要支付的總金額。 現在我們可以將計算邏輯包含在項目類中,或者可以使用訪問者模式將此邏輯移到另一個類中。 讓我們在訪問者模式示例中實現此功能。

為了實現訪客模式,首先,我們將創建用于購物車的不同類型的項目(元素)。

ItemElement.java

package com.journaldev.design.visitor;public interface ItemElement {public int accept(ShoppingCartVisitor visitor); }

注意,accept方法接受Visitor參數,我們可以有一些其他特定于項目的方法,但為簡單起見,我不打算討論太多細節,而僅關注于訪問者模式。

讓我們為不同類型的項目創建一些具體的類。

Book.java

package com.journaldev.design.visitor;public class Book implements ItemElement {private int price;private String isbnNumber;public Book(int cost, String isbn){this.price=cost;this.isbnNumber=isbn;}public int getPrice() {return price;}public String getIsbnNumber() {return isbnNumber;}@Overridepublic int accept(ShoppingCartVisitor visitor) {return visitor.visit(this);}}

水果.java

package com.journaldev.design.visitor;public class Fruit implements ItemElement {private int pricePerKg;private int weight;private String name;public Fruit(int priceKg, int wt, String nm){this.pricePerKg=priceKg;this.weight=wt;this.name = nm;}public int getPricePerKg() {return pricePerKg;}public int getWeight() {return weight;}public String getName(){return this.name;}@Overridepublic int accept(ShoppingCartVisitor visitor) {return visitor.visit(this);}}

注意具體類中accept()方法的實現,它調用Visitor的visit()方法并將其自身作為參數傳遞。

我們在Visitor界面中具有針對不同項目類型的visit()方法,將由具體的visitor類實現。

ShoppingCartVisitor.java

package com.journaldev.design.visitor;public interface ShoppingCartVisitor {int visit(Book book);int visit(Fruit fruit); }

現在,我們將實現訪客界面,并且每個項目都有其自己的邏輯來計算費用。

ShoppingCartVisitorImpl.java

package com.journaldev.design.visitor;public class ShoppingCartVisitorImpl implements ShoppingCartVisitor {@Overridepublic int visit(Book book) {int cost=0;//apply 5$ discount if book price is greater than 50if(book.getPrice() > 50){cost = book.getPrice()-5;}else cost = book.getPrice();System.out.println("Book ISBN::"+book.getIsbnNumber() + " cost ="+cost);return cost;}@Overridepublic int visit(Fruit fruit) {int cost = fruit.getPricePerKg()*fruit.getWeight();System.out.println(fruit.getName() + " cost = "+cost);return cost;}}

讓我們看看如何在客戶端應用程序中使用它。

ShoppingCartClient.java

package com.journaldev.design.visitor;public class ShoppingCartClient {public static void main(String[] args) {ItemElement[] items = new ItemElement[]{new Book(20, "1234"),new Book(100, "5678"),new Fruit(10, 2, "Banana"), new Fruit(5, 5, "Apple")};int total = calculatePrice(items);System.out.println("Total Cost = "+total);}private static int calculatePrice(ItemElement[] items) {ShoppingCartVisitor visitor = new ShoppingCartVisitorImpl();int sum=0;for(ItemElement item : items){sum = sum + item.accept(visitor);}return sum;}}

當我們運行上面的程序時,我們得到以下輸出。

Book ISBN::1234 cost =20 Book ISBN::5678 cost =95 Banana cost = 20 Apple cost = 25 Total Cost = 160

注意,如果所有項目中的accept()方法的實現都是相同的,但是可以有所不同,例如,可以使用邏輯檢查項目是否為空,那么根本不要調用visit()方法。

訪客模式類圖

我們的訪客模式實現的類圖是:

這種模式的好處是,如果操作的邏輯發生了變化,那么我們只需要在訪問者實現中進行更改,而不必在所有項目類中進行更改。

另一個好處是,將新項目添加到系統很容易,它將僅需要在訪問者界面和實現中進行更改,而現有項目類別將不受影響。

訪問者模式的缺點在于,在設計時我們應該知道visit()方法的返回類型,否則我們將不得不更改接口及其所有實現。 另一個缺點是,如果訪問者接口的實現過多,則很難擴展。

參考: Java中的訪問者設計模式 -JCG合作伙伴 Pankaj Kumar在開發人員食譜博客上的示例教程 。

翻譯自: https://www.javacodegeeks.com/2013/08/visitor-design-pattern-in-java-example-tutorial.html

總結

以上是生活随笔為你收集整理的Java中的访问者设计模式–示例教程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。