java 设计模式 示例_Java中的访问者设计模式–示例教程
java 設(shè)計模式 示例
訪客模式是行為設(shè)計模式之一 。 當我們必須對一組相似類型的對象執(zhí)行操作時,將使用訪問者模式。 借助訪問者模式,我們可以將操作邏輯從對象移動到另一個類。
例如,假設(shè)有一個購物車,我們可以在其中添加不同類型的項目(元素),當我們單擊“結(jié)帳”按鈕時,它將計算要支付的總金額。 現(xiàn)在我們可以將計算邏輯包含在項目類中,或者可以使用訪問者模式將此邏輯移到另一個類中。 讓我們在訪問者模式示例中實現(xiàn)此功能。
為了實現(xiàn)訪客模式,首先我們將創(chuàng)建要在購物車中使用的不同類型的項目(元素)。
ItemElement.java
package com.journaldev.design.visitor;public interface ItemElement {public int accept(ShoppingCartVisitor visitor); }請注意,accept方法帶有Visitor參數(shù),我們可以有一些其他方法也特定于項目,但為簡單起見,我將不討論太多細節(jié),而僅關(guān)注訪問者模式。
讓我們?yōu)椴煌愋偷捻椖縿?chuàng)建一些具體的類。
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()方法的實現(xiàn),它調(diào)用Visitor的visit()方法并將其自身作為參數(shù)傳遞。
我們在Visitor界面中具有針對不同項目類型的visit()方法,將由具體的visitor類實現(xiàn)。
ShoppingCartVisitor.java
package com.journaldev.design.visitor;public interface ShoppingCartVisitor {int visit(Book book);int visit(Fruit fruit); }現(xiàn)在,我們將實現(xiàn)訪客界面,并且每個項目都有其自己的邏輯來計算費用。
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;}}讓我們看看如何在客戶端應(yīng)用程序中使用它。
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()方法的實現(xiàn)都是相同的,但是可以不同,例如,可以使用邏輯檢查項目是否為空,那么根本不要調(diào)用visit()方法。
訪客模式類圖
我們的訪客模式實現(xiàn)的類圖是:
這種模式的好處是,如果操作邏輯發(fā)生變化,那么我們僅需要在訪問者實現(xiàn)中進行更改,而無需在所有項目類中進行更改。
另一個好處是,將新項目添加到系統(tǒng)很容易,只需要在訪問者界面和實現(xiàn)中進行更改,現(xiàn)有項目類就不會受到影響。
訪客模式的缺點在于,在設(shè)計時我們應(yīng)該知道visit()方法的返回類型,否則我們將不得不更改接口及其所有實現(xiàn)。 另一個缺點是,如果訪問者接口的實現(xiàn)過多,則很難擴展。
翻譯自: https://www.javacodegeeks.com/2013/08/visitor-design-pattern-in-java-example-tutorial.html
java 設(shè)計模式 示例
總結(jié)
以上是生活随笔為你收集整理的java 设计模式 示例_Java中的访问者设计模式–示例教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 防ddos攻击设备(ddos攻击设备 的
- 下一篇: 安卓情景模式设置在哪(安卓情景模式)