9.访问者模式
1訪問者模式的核心內容是:
A:父類中存儲一個作為關鍵字的變量。
B:子類根據這個關鍵的不同做不同的操作。
C:在訪問的時候不用關心具體的內部實現方式,通過調用得出結論接口就可以得出結論。
2訪問者模式的作用:送多個妹子花時,通過訪問者模式實現根據特點做不同的配對。
3訪問者模式具體描述
訪問者模式:訪問者模式的目的是封裝一些施加于某種數據結構元素之上的操作。
一旦這些操作需要修改的話,接受這個操作的數據結構可以保持不變。
訪問者模式適用于數據結構相對未定的系統,
它把數據結構和作用于結構上的操作之間的耦合解脫開,
使得操作集合可以相對自由的演化。訪問者模式使得增加新的操作變的很容易,
就是增加一個新的訪問者類。
訪問者模式將有關的行為集中到一個訪問者對象中,
而不是分散到一個個的節點類中。當使用訪問者模式時,
要將盡可能多的對象瀏覽邏輯放在訪問者類中,而不是放到它的子類中。
訪問者模式可以跨過幾個類的等級結構訪問屬于不同的等級結構的成員類。
?
情人節到了,要給每個MM送一束鮮花和一張卡片,
可是每個MM送的花都要針對她個人的特點,每張卡片也要根據個人的特點來挑,
我一個人哪搞得清楚,還是找花店老板和禮品店老板做一下Visitor,
讓花店老板根據MM的特點選一束花,讓禮品店老板也根據每個人特點選一張卡,
這樣就輕松多了。。
4.訪問者模式類圖
5.代碼:
#include<iostream>
#include <list>
#include <string>
using namespace std;
//訪問者模式:訪問者模式的目的是封裝一些施加于某種數據結構元素之上的操作。
//一旦這些操作需要修改的話,接受這個操作的數據結構可以保持不變。
//訪問者模式適用于數據結構相對未定的系統,
//它把數據結構和作用于結構上的操作之間的耦合解脫開,
//使得操作集合可以相對自由的演化。訪問者模式使得增加新的操作變的很容易,
//就是增加一個新的訪問者類。
//訪問者模式將有關的行為集中到一個訪問者對象中,
//而不是分散到一個個的節點類中。當使用訪問者模式時,
//要將盡可能多的對象瀏覽邏輯放在訪問者類中,而不是放到它的子類中。
//訪問者模式可以跨過幾個類的等級結構訪問屬于不同的等級結構的成員類。
?
//情人節到了,要給每個MM送一束鮮花和一張卡片,
//可是每個MM送的花都要針對她個人的特點,每張卡片也要根據個人的特點來挑,
//我一個人哪搞得清楚,還是找花店老板和禮品店老板做一下Visitor,
//讓花店老板根據MM的特點選一束花,讓禮品店老板也根據每個人特點選一張卡,
//這樣就輕松多了。
?
//訪問者模式不需要改變基類,不依賴虛函數
class Person
{
public:
??? char * action;
??? //獲得結論
??? virtual void getConclusion()
??? {
??? };
};
?
class Man :public Person
{
public:
??? void getConclusion()
??? {
??????? if (action == "成功")
??????? {
??????????? cout << "男人成功時,背后多半有一個偉大的女人。" << endl;
??????? }
??????? else if (action == "戀愛")
??????? {
??????????? cout << "男人戀愛時,凡事不懂裝懂。" << endl;
??????? }
??? }
};
?
class Woman :public Person
{
public:
??? void getConclusion()
??? {
??????? if (action == "成功")
??????? {
??????????? cout << "女人成功時,背后多半有失敗的男人。" << endl;
??????? }
??????? else if (action == "戀愛")
??????? {
??????????? cout << "女人戀愛時,遇到事懂也裝不懂。" << endl;
??????? }
??? }
};
?
int main()
{
??? list<Person*> persons;
?
??? Person *man1 = new Man();
??? man1->action = "成功";
??? persons.push_back(man1);
?
??? Person *woman1 = new Woman();
??? woman1->action = "成功";
??? persons.push_back(woman1);
?
??? Person *man2 = new Man();
??? man2->action = "戀愛";
??? persons.push_back(man2);
?
??? Person *woman2 = new Woman();
??? woman2->action = "戀愛";
??? persons.push_back(woman2);
?
??? list<Person*>::iterator iter = persons.begin();
??? while (iter != persons.end())
??? {
??????? (*iter)->getConclusion();
??????? ++iter;
??? }
?
??? cin.get();
??? return 0;
}
運行結果如下:
總結