Java 設(shè)計模式 之 訪問者模式(Visitor)_第1頁
Java 設(shè)計模式 之 訪問者模式(Visitor)_第2頁
Java 設(shè)計模式 之 訪問者模式(Visitor)_第3頁
Java 設(shè)計模式 之 訪問者模式(Visitor)_第4頁
Java 設(shè)計模式 之 訪問者模式(Visitor)_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、Java 設(shè)計模式 之 訪問者模式(Visitor)商家如何收集用戶的反饋意見 一個生產(chǎn)高能電池的廠家,下設(shè)一個客戶服務(wù)部門,其主要任務(wù)之一就是收集用戶的反饋意見,以便改進(jìn)產(chǎn)品功能和服務(wù)質(zhì)量。 以前,客戶服務(wù)部門只是采用發(fā)放調(diào)查問卷的方式。調(diào)查問卷的問題千篇一律,不能針對特殊用戶的興趣點(diǎn),尤其一些集體用戶,不會認(rèn)真對待這些問卷,懶得把問卷發(fā)到具體的使用者手里,而且,很多用戶不愿意花時間把調(diào)查問卷寄回。調(diào)查結(jié)果不全面,不真實,幾乎沒有任何效果。商家如何收集用戶的反饋意見? 之后,個性化服務(wù)、CRM客戶關(guān)系管理等概念興起,客戶服務(wù)部門引入了一套CRM客戶(用戶)關(guān)系管理系統(tǒng),對客戶信息進(jìn)行管理。針

2、對不同用戶的特點(diǎn),采用不同的調(diào)查方式。采用電話、E-Mail、傳真、問卷、登門拜訪等多種方式,對用戶進(jìn)行調(diào)查訪問。針對一些集體用戶,比如,企事業(yè)單位用戶,客戶服務(wù)人員首先訪問聯(lián)系該單位集體,安排好時間之后,客戶服務(wù)人員具體訪問每一個具體用戶,這些用戶接受客戶服務(wù)人員的訪問,給出親身使用電池產(chǎn)品的第一手資料 我們可以看到,這是一個典型的Visitor Pattern??蛻舴?wù)部門就是Visitor,不同類型的用戶就是被訪問者。客戶服務(wù)部門(Visitor)幾乎做了所有的工作,盡量不給用戶增加負(fù)擔(dān)。定義 表示一個作用于某對象結(jié)構(gòu)中的各元素的操作。它使你可以在不改變各元素類的前提下定義作用于這些元素

3、的新操作。 從定義可以看出結(jié)構(gòu)對象是使用訪問者模式必備條件,而且這個結(jié)構(gòu)對象必須存在遍歷自身各個對象的方法。這便類似于Java語言當(dāng)中的collection概念了。 本質(zhì):預(yù)留通路,實現(xiàn)回調(diào)。涉及角色1.IVisitor 抽象訪問者角色,為該對象結(jié)構(gòu)中具體元素角色聲明一個訪問操作接口。該操作接口的名字和參數(shù)標(biāo)識了發(fā)送訪問請求給具休訪問者的具休元素角色,這樣訪問者就可以通過該元素角色的特定接口直接訪問它。2.ConcreteVisitor.具體訪問者角色,實現(xiàn)Visitor聲明的接口。3.Element 定義一個接受訪問操作(accept(),它以一個訪問者(Visitor)作為參數(shù)。4.Con

4、creteElement 具體元素,實現(xiàn)了抽象元素(Element)所定義的接受操作接口。涉及角色5.ObjectStructure 結(jié)構(gòu)對象角色,這是使用訪問者模式必備的角色。它具備以下特性: 能枚舉它的元素; 可以提供一個高層接口以允許訪問者訪問它的元素; 如有需要,可以設(shè)計成一個復(fù)合對象或者一個聚集(如一個列表或無序集合)。示例IVisitor Visitor public interface Visitor public void visitEnterpriseCustomer(EnterpriseCustomer ec); public void visitPersonalCusto

5、mer(PersonalCustomer pc); ConcreteVisitorPredilectionAnalyzeVisitorpublic class PredilectionAnalyzeVisitor implements Visitor public void visitEnterpriseCustomer(EnterpriseCustomer ec) System.out.println(現(xiàn)在對企業(yè)客戶 + ec.getName() + 進(jìn)行產(chǎn)品偏好分析); public void visitPersonalCustomer(PersonalCustomer pc) Syste

6、m.out.println(現(xiàn)在對個人客戶 + pc.getName() + 進(jìn)行產(chǎn)品偏好分析); ConcreteVisitorServiceRequestVisitorpublic class ServiceRequestVisitor implements Visitor public void visitEnterpriseCustomer(EnterpriseCustomer ec) System.out.println(ec.getName() + 企業(yè)提出服務(wù)請求); public void visitPersonalCustomer(PersonalCustomer pc) S

7、ystem.out.println(客戶 + pc.getName() + 提出服務(wù)請求); Element Customer public abstract class Customer private String customerId; private String name; public String getCustomerId() return customerId; public void setCustomerId(String customerId) this.customerId = customerId; public String getName() return na

8、me; public void setName(String name) = name; public abstract void accept(Visitor visitor); ConcreteElementEnterpriseCustomerpublic class EnterpriseCustomer extends Customer private String linkman; private String linkTelephone; private String registerAddress; public String getLinkman() retu

9、rn linkman; public void setLinkman(String linkman) this.linkman = linkman; public String getLinkTelephone() return linkTelephone; ConcreteElementEnterpriseCustomer public void setLinkTelephone(String linkTelephone) this.linkTelephone = linkTelephone; public String getRegisterAddress() return registe

10、rAddress; public void setRegisterAddress(String registerAddress) this.registerAddress = registerAddress; public void accept(Visitor visitor) visitor.visitEnterpriseCustomer(this); ConcreteElementPersonalCustomerpublic class PersonalCustomer extends Customer private String telephone; private int age;

11、 public String getTelephone() return telephone; public void setTelephone(String telephone) this.telephone = telephone; public int getAge() return age; ConcreteElementPersonalCustomerpublic void setAge(int age) this.age = age; public void accept(Visitor visitor) visitor.visitPersonalCustomer(this); O

12、bjectStructure ObjectStructurepublic class ObjectStructure private Collection col = new ArrayList(); public void handleRequest(Visitor visitor) for(Customer cm : col) cm.accept(visitor); public void addElement(Customer ele) this.col.add(ele); Clientpublic class Client public static void main(String

13、args) ObjectStructure os = new ObjectStructure(); Customer cml = new EnterpriseCustomer(); cml.setName(ABC集團(tuán)); os.addElement(cml); Customer cm2 = new EnterpriseCustomer(); cm2.setName(CDE公司); os.addElement(cm2); Customer cm3 = new PersonalCustomer(); cm3.setName(張三); os.addElement(cm3); ClientServic

14、eRequestVisitor srVisitor = new ServiceRequestVisitor(); os.handleRequest(srVisitor); PredilectionAnalyzeVisitor paVisitor = new PredilectionAnalyzeVisitor(); os.handleRequest(paVisitor); 測試結(jié)果訪問者模式的優(yōu)點(diǎn) 好的擴(kuò)展性:能在不修改對象結(jié)構(gòu)的前提下,為對象結(jié)構(gòu)中的元素添加新功能。 好的復(fù)用性:可以通過訪問者來定義整個對象結(jié)構(gòu)通用的功能,從而提高復(fù)用的程度。 分離無關(guān)行為:把相關(guān)的行為封裝在一起,構(gòu)成一個訪問者,這樣每個訪問者都比較單一。訪問者模式的缺點(diǎn) 對象結(jié)構(gòu)很難變化:不適用于對象結(jié)構(gòu)中類經(jīng)常變化的情況,因為對象結(jié)構(gòu)發(fā)生了改變,訪問者的接口和訪問者得實現(xiàn)都要發(fā)生相應(yīng)的改變,代價太高。 破壞封裝:通常需要對象結(jié)構(gòu)開放內(nèi)部數(shù)據(jù)給訪問者,ObjectStructure破壞了對象的封裝性。適用情況 1) 一個對象結(jié)構(gòu)包含很多類對象,它們有不同的接口,而你想對這些對象實施一些依賴于其具體類的操作。 2)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論