今天要认识的Design Pattern我觉得比较难,但我会尽量以简单的方法让大家了解 Visitor Pattern是如何运作的,现在就来学习一下吧!
想像一下有位经验丰富的保险经纪人,为了拥有更多的客户,他必须对於不同的对象去设计不同的保单,比方说对於一般民众,可能会卖的是医疗相关的保单;而面对公司户的话,可能是针对窃盗险、天然灾害等等类型的保单,由此对症下药,提高成交的机率。
以上述例子来看,保险经纪人就相当於访问者模式中的 Visitor,他拥有不同的做法(不同类型的保单)去对应不一样的客户(也就是实体物件),而要实现的做法端看於是哪一个客户而定。
也就是说,当套用到访问者模式的时候,客户端不会调用需要的方法,而是让物件本身(也就是客户)作为参数并传递给访问者物件(保险经纪人),这时就会发挥物件导向的特性,多型(在第三天有介绍到),访问者会依据传递过来的物件去执行该物件所需的访问方法。
虽然这样的结构若是要添加其它行为,还是得修改物件的程序,但至少修改的程序不至於影响程序的运作,只需要实现一个新的访问者类别就可以了。
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();
}
}
访问者模式就是将物件与其操作行为分开,因此,当操作的逻辑发生变化的时候,我们只需要在访问者方法的程序进行修改,而不是在实体物件中修改,如果要添加新的方法的话也很容易,只要修改一下访问者的介面与其实现的类别就好,原有的物件也不会受到影响。
除此之外,也欢迎大家走走逛逛关於我们团队夥伴的文章
juck30808 - Python - 数位行销分析与 Youtube API 教学
SiQing47 - 前端?後端?你早晚都要全端的,何不从现在开始?
<<: Android Studio初学笔记-Day27-ViewPager
>>: [ 卡卡 DAY 27 ] - React Native keyboard 之乱之按萤幕就收键盘
很快的来到12月也是要结案发表的时间,今天的内容会将半年的开发项目做一个重点汇整,并且分享这一段时间...
Formatting Context 所有的HTML元素,在CSS里都可以视为box(盒子),在No...
Hoisting 先了解什麽是Hoisting,也就是宣告提升。 此种行为现象主因,是由於js在初始...
前言 就如第一天提到的,资料库可以说是一家公司的命脉,如果资料库不小心被外部攻击者入侵导致资料遗失、...
如果有错误,欢迎留言指教~ Q_Q 上篇 Day 16 - 用 useReducer 取代 Red...