生活随笔
收集整理的這篇文章主要介紹了
《研磨设计模式》chap25 访问者模式Visitor(2)模式应用到场景
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 實現
//各種客戶的父類
public abstract class Customer { private String customerId
;// 客戶編號 private String name
; //客戶名稱 ...
get().
set()public abstract void
accept(Visitor visitor
);
}//企業客戶
public class EnterpriseCustomer extends Customer{ private String linkman
;//聯系人 private String linkTelephone
;//聯系電話 private String registerAddress
;//企業注冊地址public abstract void
accept(Visitor visitor
);
} //個人客戶
public class PersonalCustomer extends Customer{private String telephone
; //聯系電話 private int age
;//年齡public void accept(Visitor visitor) {//回調訪問者對象的相應方法visitor.
visitPersonalCustomer(this
);}
}//訪問者接口
public interface Visitor {//訪問企業客戶,相當于給企業客戶添加訪問者的功能 public void
visitEnterpriseCustomer(EnterpriseCustomer ec
);//訪問個人客戶,相當于給個人客戶添加訪問者的功能 public void
visitPersonalCustomer(PersonalCustomer pc
);
}public class WorthAnalyzeVisitor implements Visitor {public void visitEnterpriseCustomer(EnterpriseCustomer ec){//根據購買的金額大小、購買的產品和服務的多少、購買的頻率等進行分析//企業客戶的標準會比個人客戶的高System.out.
println("現在對企業客戶"+ec.
getName()+
"進行價值分析");}public void visitPersonalCustomer(PersonalCustomer pc){System.out.
println("現在對個人客戶"+pc.
getName()+
"進行價值分析");}
}public class ServiceRequestVisitor implements Visitor {public void visitEnterpriseCustomer(EnterpriseCustomer ec){//企業客戶提出的具體服務請求System.out.
println(ec.
getName()+
"企業提出服務請求");}public void visitPersonalCustomer(PersonalCustomer pc){//個人客戶提出的具體服務請求System.out.
println("客戶"+pc.
getName()+
"提出服務請求");}
}
public class ObjectStructure {//要操作的客戶集合 private Collection<Customer> col = new ArrayList<Customer>
();//提供給客戶端操作的高層接口,具體的功能由客戶端傳入的訪問者決定 public void handleRequest(Visitor visitor){//循環對象結構中的元素,接受訪問for(Customer cm : col){cm.
accept(visitor
);}}//組建對象結構,向對象結構中添加元素。 public void addElement(Customer ele){this.col.
add(ele
);}
}public static void main(String[] args) {//創建ObjectStructObjectStructure os = new
ObjectStructure();//準備點測試數據,創建客戶對象,并加入ObjectStructureCustomer cm1 = new
EnterpriseCustomer();cm1.
setName("ABC集團");os.
addElement(cm1
);Customer cm2 = new
EnterpriseCustomer();cm2.
setName("CDE公司");os.
addElement(cm2
);Customer cm3 = new
PersonalCustomer();cm3.
setName("張三");os.
addElement(cm3
);//客戶提出服務請求,傳入服務請求的VisitorServiceRequestVisitor srVisitor = new
ServiceRequestVisitor();os.
handleRequest(srVisitor
);//要對客戶進行偏好分析,傳入偏好分析的VisitorPredilectionAnalyzeVisitor paVisitor = new
PredilectionAnalyzeVisitor();os.
handleRequest(paVisitor
);//要對客戶進行價值分析,傳入價值分析的VisitorWorthAnalyzeVisitor waVisitor = new
WorthAnalyzeVisitor();os.
handleRequest(waVisitor
); }
2. 總結
1.訪問者的功能
訪問者模式能給一系列對象透明地添加新功能,從而避免在維護期間對這一系列對象進行修改,而且還能變相實現復用訪問者所具有的功能。
由于是針對一系列對象的操作,這也導致,如果只想給一系列對象中的部分對象添加功能,就會有些麻煩;而且要始終能保證把這一系列對象都調用到,不管是循環,還是遞歸,總之要讓每個對象都要被訪問到。
2.調用通路
訪問者之所以能實現“為一系列對象透明地添加新功能”,注意是透明的,也就是這一系列對象是不知道被添加功能的。
重要的就是依靠通用方法,訪問者這邊說要去訪問,就提供一個訪問的方法,如visit方法;而對象那邊說,好的,我接受你的訪問,提供一個接受訪問的方法,如accept方法。這兩個方法并不代表任何具體的功能,只是構成一個調用的通路,那么真正的功能實現在哪里呢?又如何調用到呢?
很簡單,就在accept方法里面,回調visit的方法,從而回調到訪問者的具體實現上,而這個訪問者的具體實現的方法才是要添加的新的功
總結
以上是生活随笔為你收集整理的《研磨设计模式》chap25 访问者模式Visitor(2)模式应用到场景的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。