目錄:
設計模式學習筆記首頁
設計模式(1)——抽象工廠 abstractfactory
設計模式(2)——生成器 builder
設計模式(3)——工廠方法 factory method
設計模式(4)——原型 prototype
設計模式(5)——單例 singleton
設計模式(6)——介面卡 adapter
設計模式(7)——橋接 bridge
設計模式(8)——組合 composite
設計模式(9)——裝飾 decorator
設計模式(10)——外觀 facade
設計模式(11)——享元 flyweight
設計模式(12)——** proxy
設計模式(13)——職責鏈 chain of responsibility
設計模式(14)——命令 command
設計模式(15)——直譯器 interpreter
設計模式(16)——迭代器 iterator
設計模式(17)——中介者 mediator
設計模式(18)——備忘錄 memento
設計模式(19)——觀察者 observer
設計模式(20)——狀態 state
設計模式(21)——策略 strategy
設計模式(22)——模板方法 template method
設計模式(23)——訪問者 visitor
表示乙個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素的前提下定義作用於這些元素的新操作。
乙個物件結構中包含很多類物件,它們有不同的介面,而你想對這些物件實施一些依賴於其具體類的操作。
需要對乙個物件結構中的物件進行很多不同的並且不相關的操作,而你想避免讓這些操作「汙染」這些物件的類。visitor 使得你可以將相關的操作集中起來定義在乙個類中。當該物件被很多應用共享時,用 visitor 模式讓每個應用僅包含需要用到的操作。
定義物件結構的類很少改變,但經常需要在此結構上定義新的操作。改變物件結構類需要重定義對所有訪問者的介面,這可能需要很大的代價。如果物件結構類經常改變,那麼可能還是在這些類中定義這些操作較好。
composite: 訪問者可以用於對乙個由 composite 模式定義的物件結構進行操作。
interpreter: 訪問者可以用於解釋。
visitor 模式可以使得element在不修改自己的同時增加新的操作,但是這也帶來了至少以下兩個顯著問題:
破壞了封裝性。visitor 模式要求 visitor 可以從外部修改 element 物件的狀態,這一般通過兩個方式來實現:
element 提供足夠的 public 介面,使得 visitor 可以通過呼叫這些介面達到修改 element 狀態的目的;
element 暴露更多的細節給 visitor,或者讓 element 提供 public 的實現給 visitor(當然也給了系統中其他的物件),或者將 visitor 宣告為 element 的 friend 類,僅將細節暴露給 visitor。但是無論哪種情況,特別是後者都將是破壞了封裝性原則(實際上就是 c++ 的 friend 機制得到了很多的物件導向專家的詬病)。
concreteelement 的擴充套件很困難:每增加乙個 element 子類,就要修改 visitor 的介面,使得可以提供給這個新增加的子類的訪問機制。
編寫元素抽象基類element
,包含乙個純虛函式(介面方法)accept(visitor* vis)
編寫訪問者抽象基類visitor
,包含訪問元素的方法visitconcreteelementa(element* elm)
、visitconcreteelementb(element* elm)
元素的子類定義accept
函式,呼叫具體訪問者的具體訪問元素方法visitconcreteelementa(element* elm)
、visitconcreteelementb(element* elm)
visitor.h
#pragma once
class concreteelementa;
class concreteelementb;
class element;
class visitor ;
class concretevisitora : public visitor ;
class concretevisitorb : public visitor ;
visitor.cpp#include "visitor.h"
#include "element.h"
#include
using
namespace::std;
visitor::visitor() {}
visitor::~visitor() {}
concretevisitora::concretevisitora() {}
concretevisitora::~concretevisitora() {}
void concretevisitora::visitconcreteelementa(element* elm)
void concretevisitora::visitconcreteelementb(element* elm)
concretevisitorb::concretevisitorb() {}
concretevisitorb::~concretevisitorb() {}
void concretevisitorb::visitconcreteelementa(element* elm)
void concretevisitorb::visitconcreteelementb(element* elm)
element.h#pragma once
class visitor;
class element ;
class concreteelementa : public element ;
class concreteelementb : public element ;
element.cpp#include "element.h"
#include "visitor.h"
#include using namespace::std;
element::element() {}
element::~element() {}
void element::accept(visitor* vis){}
concreteelementa::concreteelementa() {}
concreteelementa::~concreteelementa() {}
void concreteelementa::accept(visitor* vis)
concreteelementb::concreteelementb(){}
concreteelementb::~concreteelementb() {}
void concreteelementb::accept(visitor* vis)
main.cpp#include "visitor.h"
#include "element.h"
#include
using
namespace::std;
int main(int argc, char* argv)
Java設計模式之訪問者模式 Visitor 實踐
訪問者模式定義 主要將資料結構與資料操作分離。需要處理穩定的資料結構和易變的操作耦合問題,此時可以使用訪問者模式。以下 演示訪問者模式簡單的實際運用 定義乙個介面gohome package com.ldl.cn.visitormodel public inte ce gohome定義乙個類goho...
設計模式(23) 訪問者模式
訪問者模式,用來解決多個訪問者訪問多個不同元素的問題。訪問者模式引入了訪問者角色和被訪問者角色,不同訪問者訪問元素的方式不同。公司員工分為全職員工和兼職員工 這裡員工就是被訪問者 公司有財務部結算工資,人力資源部計算工作時長 這裡財務部和人力資源部為訪問者 於是就有了不同訪問者訪問不同被訪問者的情況...
23種設計模式 訪問者模式
在訪問者模式 visitor pattern 中,我們使用了乙個訪問者類,它改變了元素類的執行演算法。通過這種方式,元素的執行演算法可以隨著訪問者改變而改變。這種型別的設計模式屬於行為型模式。根據模式,元素物件已接受訪問者物件,這樣訪問者物件就可以處理元素物件上的操作。意圖 主要將資料結構與資料操作...