在訪問者模式(visitor pattern)中,我們使用了乙個訪問者類,它改變了元素類的執行演算法。通過這種方式,元素的執行演算法可以隨著訪問者改變而改變。這種型別的設計模式屬於行為型模式。根據模式,元素物件已接受訪問者物件,這樣訪問者物件就可以處理元素物件上的操作。
意圖:
主要將資料結構與資料操作分離。
主要解決:
穩定的資料結構和易變的操作耦合問題。
何時使用:
在被訪問的類裡面加乙個對外提供接待訪問者的介面。
關鍵**:
在資料基礎類裡面有乙個方法接受訪問者,將自身引用傳入訪問者。
應用例項:
您在朋友家做客,您是訪問者,朋友接受您的訪問,您通過朋友的描述,然後對朋友的描述做出乙個判斷,這就是訪問者模式。
優點:
1、符合單一職責原則。
2、優秀的擴充套件性。
3、靈活性。
缺點:
1、具體元素對訪問者公布細節,違反了迪公尺特原則。
2、具體元素變更比較困難。
3、違反了依賴倒置原則,依賴了具體類,沒有依賴抽象。
使用場景:
1、物件結構中物件對應的類很少改變,但經常需要在此物件結構上定義新的操作。
2、需要對乙個物件結構中的物件進行很多不同的並且不相關的操作,而需要避免讓這些操作"汙染"這些物件的類,也不希望在增加新操作時修改這些類。
注意事項:
訪問者可以對功能進行統一,可以做報表、ui、***與過濾器。
#pragma once
#include#include#includeclass parkelement;
// visitor抽象類
class visitorpattern
; ~visitorpattern() {};
virtual void visit(parkelement* parkelement) = 0;
};// 公園抽象類
class parkelement
;// 公園具體類a,表示公園的a部分
class parka:public parkelement
private:
protected:
};// 公園具體類b,表示公園的b部分
class parkb :public parkelement
~parkb() {}
virtual void accept(visitorpattern* visitor)
private:
protected:
};// 公園具體類,表示整個公園
class park :public parkelement
~park() {};
// 組裝公園的各個部分
void setparkelement(parkelement* parkelement)
virtual void accept(visitorpattern* visitor) }
private:
std::listm_parkelementlist;
protected:
};// visitor具體類a
class visitora:public visitorpattern
; ~visitora() {};
virtual void visit(parkelement* parkelement) };
// visitor具體類b
class visitorb :public visitorpattern
; ~visitorb() {};
virtual void visit(parkelement* parkelement) };
// 管理者類
class managervisit :public visitorpattern
; ~managervisit() {};
virtual void visit(parkelement* parkelement)
private:
protected:
};
#include "visitorpattern.h"
#include#include#include "visitorpattern.h"
int maintest1(void)
int maintest2(void)
int main(void)
設計模式學習筆記 訪問者模式
我對訪問者模式的理解是,對於同乙個物件或者資料來源,由訪問者決定這個物件的處理方式或者資料呈現模式。最簡單的,對於同樣銷售資料,對銷售者而言,它可能需要知道的是自己的銷售多少商品,獲得了多少錢,但對老闆而言,它需要這份銷售記錄整理出,每種商品的增長趨勢,以決定未來的銷售策略。如下 inte ce i...
設計模式筆記 訪問者模式
訪問者模式 表示乙個作用於某物件結構中的各元素的操作,它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。visitor類,為該物件結構中concretevisitor的每乙個類宣告乙個visit操作。訪問者介面為使用不同演算法的子類宣告訪問操作。public abstract clas...
設計模式筆記 訪問者模式
封裝一些作用於某種資料結構中的各元素的操作,它可以在不改變資料結構的前提下定義作用於這些元素的新的操作。visitor 抽象訪問者 抽象類或介面,宣告訪問者可以訪問哪些元素,具體到程式中就是visit方法的引數定義哪些物件是可以被訪問的 public inte ce ivisitorvisitor ...