IT铁人DAY 27-Visitor 访问者模式

  今天要认识的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 - 前端?後端?你早晚都要全端的,何不从现在开始?


<<:  Android Studio初学笔记-Day27-ViewPager

>>:  [ 卡卡 DAY 27 ] - React Native keyboard 之乱之按萤幕就收键盘

Day 21 - 研习计画之结案发表与业师心得篇

很快的来到12月也是要结案发表的时间,今天的内容会将半年的开发项目做一个重点汇整,并且分享这一段时间...

27. 解释 CSS 的 BFC(Block Formatting Context)

Formatting Context 所有的HTML元素,在CSS里都可以视为box(盒子),在No...

[ JS个人笔记 ] Hoisting&Scope Chain—DAY4

Hoisting 先了解什麽是Hoisting,也就是宣告提升。 此种行为现象主因,是由於js在初始...

Day23-你的资料安全吗(一)

前言 就如第一天提到的,资料库可以说是一家公司的命脉,如果资料库不小心被外部攻击者入侵导致资料遗失、...

Day 17 - useReducer + useContext = Redux?

如果有错误,欢迎留言指教~ Q_Q 上篇 Day 16 - 用 useReducer 取代 Red...