設計模式(23) 訪問者 Visitor

2021-08-10 13:43:30 字數 3851 閱讀 5416

目錄:

設計模式學習筆記首頁

設計模式(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 中,我們使用了乙個訪問者類,它改變了元素類的執行演算法。通過這種方式,元素的執行演算法可以隨著訪問者改變而改變。這種型別的設計模式屬於行為型模式。根據模式,元素物件已接受訪問者物件,這樣訪問者物件就可以處理元素物件上的操作。意圖 主要將資料結構與資料操作...