iT邦幫忙

2021 iThome 鐵人賽

DAY 27
1

  今天要認識的Design Pattern我覺得比較難,但我會盡量以簡單的方法讓大家了解 Visitor Pattern是如何運作的,現在就來學習一下吧!


問題情境與解析

  想像一下有位經驗豐富的保險經紀人,為了擁有更多的客戶,他必須對於不同的對象去設計不同的保單,比方說對於一般民眾,可能會賣的是醫療相關的保單;而面對公司戶的話,可能是針對竊盜險、天然災害等等類型的保單,由此對症下藥,提高成交的機率。

  以上述例子來看,保險經紀人就相當於訪問者模式中的 Visitor,他擁有不同的做法(不同類型的保單)去對應不一樣的客戶(也就是實體物件),而要實現的做法端看於是哪一個客戶而定。

  也就是說,當套用到訪問者模式的時候,客戶端不會調用需要的方法,而是讓物件本身(也就是客戶)作為參數並傳遞給訪問者物件(保險經紀人),這時就會發揮物件導向的特性,多型(在第三天有介紹到),訪問者會依據傳遞過來的物件去執行該物件所需的訪問方法。

  雖然這樣的結構若是要添加其它行為,還是得修改物件的程式,但至少修改的程式不至於影響程式的運作,只需要實現一個新的訪問者類別就可以了。

Class Diagram

https://ithelp.ithome.com.tw/upload/images/20211012/20140743BADDfu9GO5.png

Skeleton Code

interface Element {
    public Type accept(Visitor v);
}

class ElementA implements Element {
    
    public Type featureA() {...}
    
    public Type accept(Visitor v) {
        return v.visit(this);
    }
}

class ElementB implements Element {

    public Type featureB() {...}
    
    public Type accept(Visitor v) {
        return v.visit(this);
    }
}

interface Visitor {
    public String visit(ElementA element);
    public String visit(ElementB element);
}

class ConcreteVisitor implements Visitor {
    
    public Type visit(ElementA e) {
        // The algorithm of the ElementA
        e.featureA();
    }
    
    public Type visit(ElementB e) {
        // The algorithm of the ElementB
        e.featureB();
    }
}

  訪問者模式就是將物件與其操作行為分開,因此,當操作的邏輯發生變化的時候,我們只需要在訪問者方法的程式進行修改,而不是在實體物件中修改,如果要添加新的方法的話也很容易,只要修改一下訪問者的介面與其實現的類別就好,原有的物件也不會受到影響。


除此之外,也歡迎大家走走逛逛關於我們團隊夥伴的文章

lu23770127 - SASS 基礎初學三十天

10u1 - 糟了!是世界奇觀!

juck30808 - Python - 數位行銷分析與 Youtube API 教學

SiQing47 - 前端?後端?你早晚都要全端的,何不從現在開始?


上一篇
IT鐵人DAY 26-Memento 備忘錄模式
下一篇
IT鐵人DAY 28-Observer 觀察者模式
系列文
淺談物件導向與Design Pattern介紹30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
juck30808
iT邦研究生 1 級 ‧ 2021-10-12 18:30:30

第27天了! 恭喜即將完賽 (拍手!!!

我要留言

立即登入留言