程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 詳解C++設計形式編程中對拜訪者形式的應用

詳解C++設計形式編程中對拜訪者形式的應用

編輯:關於C++

詳解C++設計形式編程中對拜訪者形式的應用。本站提示廣大學習愛好者:(詳解C++設計形式編程中對拜訪者形式的應用)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解C++設計形式編程中對拜訪者形式的應用正文


拜訪者形式(visitor),表現一個感化於某對象構造中的各元素的操作。它使你可以在不轉變各元素的類的條件下界說感化於這些元素的新操作。拜訪者形式實用於數據構造絕對穩固的體系。它把數據構造和感化於構造上的操作之間的耦合擺脫開,使得操作聚集可以絕對自在地演變。拜訪者形式的目標是要把處置從數據構造分別出來。許多體系可以依照算法和數據構造離開,假如如許的體系有比擬穩固的數據構造,又有易於變更的算法的話,應用拜訪者形式就是比擬適合的,由於拜訪者形式使得算法操作的增長變得輕易。反之,假如如許的體系的數據構造對象易於變更,常常要有新的數據對象增長出去,就不合適應用拜訪者形式。

拜訪者形式的長處就是增長新的操作很輕易,由於增長新的操作就意味著增長一個新的拜訪者。拜訪者形式將有關的行動集中到一個拜訪者對象中。平日concreteVisitor可以零丁開辟,不用跟concreteElement寫在一路。拜訪者的缺陷其實也就是使增長新的數據構造變得艱苦了。

構造圖:

拜訪者形式根本示例代碼

拜訪者形式 visitor.h、concreteVisitor.h、element.h、concreteElement.h、objectStructure.h

客戶端 visitorApp.cpp

拜訪者形式

visitor.h
/************************************************************************ 
 * description: 為該對象構造中ConcreteElement的每個類聲明一個visit操作 
 * remark:  
************************************************************************/ 
#ifndef _VISITOR_H_ 
#define _VISITOR_H_ 
class concreteElementA; 
class concreteElementB; 
class visitor 
{ 
public: 
 visitor(){}; 
 virtual ~visitor(){}; 
 virtual void visitConcreteElementA(concreteElementA* pConcreteElementA) = 0; 
 virtual void visitConcreteElementB(concreteElementB* pConcreteElementB) = 0; 
}; 
#endif// _VISITOR_H_ 

 

concreteVisitor.h

/************************************************************************ 
 * description: 詳細拜訪者,完成每一個由visitor聲明的操作。每一個操作完成算法 
    的一部門,而該算法片段乃是對應於構造中對象的類 
 * remark:  
************************************************************************/ 
#ifndef _CONCRETE_VISITOR_H_ 
#define _CONCRETE_VISITOR_H_ 
#include "visitor.h" 
#include <iostream> 
using namespace std; 
class concreteVisitor1 : public visitor 
{ 
public: 
 concreteVisitor1(){}; 
 ~concreteVisitor1(){}; 
 virtual void visitConcreteElementA(concreteElementA* pConcreteElementA) 
 { 
  cout << "concreteElementA被concreteVisitor1拜訪" << endl;  
 } 
 virtual void visitConcreteElementB(concreteElementB* pConcreteElementB) 
 { 
  cout << "concreteElementB被concreteVisitor1拜訪" << endl;   
 } 
}; 
 
class concreteVisitor2 : public visitor 
{ 
public: 
 concreteVisitor2(){}; 
 ~concreteVisitor2(){}; 
 virtual void visitConcreteElementA(concreteElementA* pConcreteElementA) 
 { 
  cout << "concreteElementA被concreteVisitor2拜訪" << endl;  
 } 
 virtual void visitConcreteElementB(concreteElementB* pConcreteElementB) 
 { 
  cout << "concreteElementB被concreteVisitor2拜訪" << endl;   
 } 
}; 
#endif// _CONCRETE_VISITOR_H_ 

element.h

/************************************************************************ 
 * description: 界說一個accept操作,它以一個拜訪者為參數 
 * remark:  
************************************************************************/ 
#ifndef _ELEMENT_H_ 
#define _ELEMENT_H_ 
class visitor; 
class element 
{ 
public: 
 element(){}; 
 virtual ~element(){}; 
 virtual void accept(visitor* pVisitor) = 0; 
}; 
#endif// _ELEMENT_H_ 

  

concreteElement.h

#ifndef _CONCRETE_ELEMENT_H_ 
#define _CONCRETE_ELEMENT_H_ 
#include "element.h" 
#include <iostream> 
using namespace std; 
class concreteElementA : public element 
{ 
public: 
 concreteElementA(){}; 
 ~concreteElementA(){}; 
 // 充足應用雙分配技巧,完成處置與數據構造的分別 
 virtual void accept(visitor* pVisitor) 
 { 
  if (NULL != pVisitor) 
  { 
   pVisitor->visitConcreteElementA(this); 
  } 
 } 
 // 其他的相干辦法 
 void operationA() 
 { 
  cout << "詳細元素A的其他相干辦法" << endl; 
 } 
}; 
class concreteElementB : public element 
{ 
public: 
 concreteElementB(){}; 
 ~concreteElementB(){}; 
 // 充足應用雙分配技巧,完成處置與數據構造的分別 
 virtual void accept(visitor* pVisitor) 
 { 
  if (NULL != pVisitor) 
  { 
   pVisitor->visitConcreteElementB(this); 
  } 
 } 
 // 其他的相干辦法 
 void operationB() 
 { 
  cout << "詳細元素B的其他相干辦法" << endl; 
 } 
}; 
#endif// _CONCRETE_ELEMENT_H_ 

 

objectStructure.h

/************************************************************************ 
 * description: 列舉元素,可以供給一個高層的接口以許可拜訪者拜訪它的元素 
 * remark:  
************************************************************************/ 
#ifndef _OBJECT_STRUCTURE_H_ 
#define _OBJECT_STRUCTURE_H_ 
#include "element.h" 
#include "visitor.h" 
#include <list> 
using namespace std; 
class objectStructure 
{ 
public: 
 void attach(element* pElement) 
 { 
  m_list.push_back(pElement); 
 } 
 void detach(element* pElement) 
 { 
  m_list.remove(pElement); 
 } 
 void accept(visitor* pVisitor) 
 { 
  list<element*>::iterator Iter; 
  for (Iter = m_list.begin(); Iter != m_list.end(); ++Iter) 
  { 
   if (NULL != *Iter) 
   { 
    (*Iter)->accept(pVisitor); 
   }    
  } 
 } 
private: 
 list<element*> m_list; 
}; 
#endif// _OBJECT_STRUCTURE_H_ 

客戶端      

visitorApp.cpp

// visitorApp.cpp : 界說掌握台運用法式的進口點。 
// 
#include "stdafx.h" 
#include "objectStructure.h" 
#include "concreteElement.h" 
#include "concreteVisitor.h" 
void freePtr(void* vptr) 
{ 
 if (NULL != vptr) 
 { 
  delete vptr; 
  vptr = NULL; 
 } 
} 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
 objectStructure* pObject = new objectStructure(); 
 if (NULL != pObject) 
 { 
  element* pElementA = new concreteElementA(); 
  element* pElementB = new concreteElementB(); 
  pObject->attach(pElementA); 
  pObject->attach(pElementB); 
  concreteVisitor1* pVisitor1 = NULL; 
  pVisitor1 = new concreteVisitor1(); 
  concreteVisitor2* pVisitor2 = NULL; 
  pVisitor2 = new concreteVisitor2(); 
  pObject->accept(pVisitor1); 
  pObject->accept(pVisitor2); 
  system("pause"); 
  freePtr(pVisitor2); 
  freePtr(pVisitor1); 
  freePtr(pElementB); 
  freePtr(pElementA); 
  freePtr(pObject); 
 } 
 return 0; 
} 

應用拜訪者形式的長處和缺陷

拜訪者形式有以下的長處:

  • 拜訪者形式使得增長新的操作變得很輕易。假如一些操作依附於一個龐雜的構造對象的話,那末普通而言,增長新的操作會很龐雜。而應用拜訪者形式,增長新的操作就意味著增長一個新的拜訪者類,是以,變得很輕易。
  • 拜訪者形式將有關的行動集中到一個拜訪者對象中,而不是疏散到一個個的節點類中。
  • 拜訪者形式可以跨過幾個類的品級構造拜訪屬於分歧的品級構造的成員類。迭代子只能拜訪屬於統一個類型品級構造的成員對象,而不克不及拜訪屬於分歧品級構造的對象。拜訪者形式可以做到這一點。
  • 積聚狀況。每個零丁的拜訪者對象都集中了相干的行動,從而也便可以在拜訪的進程中將履行操作的狀況積聚在本身外部,而不是疏散到許多的節點對象中。這是無益於體系保護的長處。

拜訪者形式有以下的缺陷:

  • 增長新的節點類變得很艱苦。每增長一個新的節點都意味著要在籠統拜訪者腳色中增長一個新的籠統操作,並在每個詳細拜訪者類中增長響應的詳細操作。
  • 損壞封裝。拜訪者形式請求拜訪者對象拜訪並挪用每個節點對象的操作,這隱含了一個對一切節點對象的請求:它們必需裸露一些本身的操作和外部狀況。否則,拜訪者的拜訪就變得沒成心義。因為拜訪者對象本身會積聚拜訪操作所需的狀況,從而使這些狀況不再存儲在節點對象中,這也是損壞封裝的。

拜訪者形式的實用場景:

  • 一個對象構造包括許多類對象,它們有分歧的接口,而你想對這些對象實行一些依附於其詳細類的操作。
  • 須要對一個對象構造中的對象停止許多分歧的而且不相干的操作,而你想防止讓這些操作“淨化”這些對象的類。Vi s i t o r 使得你可以將相干的操作集中起來界說在一個類中。當該對象構造被許多運用同享時,用Vi s i t o r 形式讓每一個運用僅包括須要用到的操作。
  • 界說對象構造的類很少轉變,但常常須要在此構造上界說新的操作。轉變對象構造類須要重界說對一切拜訪者的接口,這能夠須要很年夜的價值。假如對象構造類常常轉變,那末能夠照樣在這些類中界說這些操作較好。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved