设计模式的理解: 访问器模式 Visitor
在訪問者模式(Visitor Pattern)中,我們使用了一個訪問者類,它改變了元素類的執行算法。通過這種方式,元素的執行算法可以隨著訪問者改變而改變。這種類型的設計模式屬于行為型模式。根據模式,元素對象已接受訪問者對象,這樣訪問者對象就可以處理元素對象上的操作。
在軟件構建過程中,由于需求的改變,某些類層次結構中需要增加新的行為,如果這些操作在基類中進行更改,那么派生類也要做出響應的變更,給變更工作帶來繁重的負擔。訪問器模式,就是把原來基類和派生類的實現放在訪問器類中,各個派生類訪問這些訪問器的操作方法。而訪問器中的操作方法接受派生類的實體,對派生類的屬性進行操作。這樣要變更操作方法只需要變更具體的訪問器,而不需要變更基類和派生類。
以文件流和網絡流為例, 其訪問器模式 ,流的實現結構如下:
/*********建立穩定的實體類和抽象訪問器類************/ class IVisitor{ public:virtual void visitFileStream(FileStream & )=0;virtual void visitNetWorkStream(NetWorkStream &)=0; } class IStream{ public:void acceptVisitor(IVisitor&) = 0; } class FileStream : public IStream{ public:File file_;void acceptVisitor(IVisitor& v){ v.visitFileStream(*this);} } class NetWorkStream : public IStream{ public:string url_;void acceptVisitor(IVisitor& v){ v.visitNetWorkStream(*this);} }假如:流的功能有 讀和寫? , 那么 讀操作和寫操作不再 流對象中實現,而是把這些操作變成一個類的對象,這個類的對象派生自訪問器類
/*****給流添加讀寫操作,(用偽碼演示)*****/ class ReadStreamVisitor :IVisitor{string output_; public:virtual void visitFileStream(FileStream &fs){File file = fs.file_;....output_=file.getcontent();}virtual void visitNetWorkStream(NetWorkStream & ns){NetwoarkRequest NetwoarkRequest(ns.url_);...output_=NetwoarkRequest.getcontent();} }class WriteStreamVisitor :IVisitor{ public:string inputstr_; //輸入參數可以用Visitor存 public:virtual void visitFileStream(FileStream &fs){File file = fs.file_;....file.write(inputstr_);}virtual void visitNetWorkStream(NetWorkStream & ns){NetwoarkRequest NetwoarkRequest(ns.url_);...NetwoarkRequest.write(inputstr_);} }調用示例:
void main(){//讀取網絡內容NetWorkStream ns;ns.url_ = "www.baidu.com";ReadStreamVisitor readVisitor;ns.accept(readVisitor);cout<<"網絡讀取的內容有:" <<readVisitor.output_;//寫文件內容File file("C:/test.txt");FileStream fs(file);WriteStreamVisitor writeVisitor;writeVisitor.inputstr_ = "寫入一些文本"'fs.accept(WriteStreamVisitor ); }如果需求要求變更寫操作方法,那么只需要變動WriteStreamVisitor中的方法而不需要變動其他類。如果需求要求新增一個流方法,只需要新增一個Visitor派生類就可以。而不需要從基類從派生類從下至上的修改,造成業務需求的變更影響范圍大。
當然,訪問者模式只適合類的層次結構穩定,操作擴展變動頻繁的業務場景。所謂的層次結構穩定就是實體類的關系很少根據需求而變化。例如如果新增一個 DataBaseStream,那么每個Visitor都要再實現關于DataBaseStream的操作。訪問者模式的目的就是為了減少 實體和實體方法間的耦合程度,減小變更實體方法的影響性。如果層次結構不穩定,那么使用訪問者模式就得不償失.
?
總結
以上是生活随笔為你收集整理的设计模式的理解: 访问器模式 Visitor的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式的理解:命令模式 (Comman
- 下一篇: 设计模式的理解:解释器模式 Interp