日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式的理解: 访问器模式 Visitor

發布時間:2024/10/14 asp.net 163 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式的理解: 访问器模式 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。