Chinaunix首页 | 论坛 | 博客
  • 博客访问: 171632
  • 博文数量: 60
  • 博客积分: 15
  • 博客等级: 民兵
  • 技术积分: 638
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-26 10:59
个人简介

喜欢coding,因为那是一件伟大的事情,是将无生命的IC赋予灵魂的过程,让我拥有了和上帝一样的成就感。(w1c2g3@163.com)

文章分类

全部博文(60)

文章存档

2017年(7)

2016年(41)

2015年(1)

2014年(4)

2013年(7)

我的朋友

分类: C/C++

2016-10-30 23:00:46

代理模式 为另一个对象提供一个替身或占位符以控制对这个对象的访问。




  1. #include <iostream>

  2. using namespace std;

  3. class CSubject {
  4. public:
  5.     CSubject() {};
  6.     virtual ~CSubject() {}
  7.     virtual void Request() = 0;
  8. };

  9. class CRealSubject : public CSubject {
  10. public:
  11.     CRealSubject() {}
  12.     ~CRealSubject() {}
  13.     void Request() {
  14.         cout << "CRealSubject Request" << endl;
  15.     }
  16. };

  17. class CProxy : public CSubject
  18. {
  19. public:
  20.     CProxy() : m_pRealSubject(NULL) {}
  21.     ~CProxy() {
  22.         delete m_pRealSubject;
  23.     }
  24.     void Request() {
  25.         if (NULL == m_pRealSubject) {
  26.             m_pRealSubject = new CRealSubject();
  27.         }
  28.         cout << "CProxy Request" << endl;
  29.         m_pRealSubject->Request();
  30.     }

  31. private:
  32.     CRealSubject *m_pRealSubject;
  33. };


  34. int main(int argc, char **argv)
  35. {
  36.     CSubject *client = new CProxy();

  37.     client->Request();

  38.     delete client;
  39. }

利用代理模式实现的SmartPointer:

  1. #include <iostream>

  2. using namespace std;

  3. class KRefCount {
  4. public:
  5.     KRefCount():m_nCount(0){}

  6. public:
  7.     int AddRef(){ return ++m_nCount; }
  8.     int Release(){ return --m_nCount; }
  9.     void Reset(){ m_nCount = 0; }

  10. private:
  11.     int m_nCount;
  12. };

  13. template <typename T>
  14. class SmartPtr {
  15. public:
  16.     SmartPtr(void) : m_pData(NULL) {
  17.         m_pReference = new KRefCount();
  18.         m_pReference->AddRef();
  19.     }

  20.     SmartPtr(T* pValue) : m_pData(pValue) {
  21.         m_pReference = new KRefCount();
  22.         m_pReference->AddRef();
  23.     }

  24.     SmartPtr(const SmartPtr<T>& sp)
  25.         : m_pData(sp.m_pData)
  26.         , m_pReference(sp.m_pReference) {
  27.         m_pReference->AddRef();
  28.     }

  29.     ~SmartPtr(void) {
  30.         if (m_pReference && m_pReference->Release() == 0) {
  31.             delete m_pData;
  32.             delete m_pReference;
  33.         }
  34.     }

  35.     inline T& operator*() {
  36.         return *m_pData;
  37.     }

  38.     inline T* operator->() {
  39.         return m_pData;
  40.     }

  41.     SmartPtr<T>& operator=(const SmartPtr<T>& sp) {
  42.         if (this != &sp) {
  43.             if (m_pReference && m_pReference->Release() == 0) {
  44.                 delete m_pData;
  45.                 delete m_pReference;
  46.             }

  47.             m_pData = sp.m_pData;
  48.             m_pReference = sp.m_pReference;
  49.             m_pReference->AddRef();
  50.         }

  51.         return *this;
  52.     }

  53.     SmartPtr<T>& operator=(T* pValue) {
  54.         if (m_pReference && m_pReference->Release() == 0) {
  55.             delete m_pData;
  56.             delete m_pReference;
  57.         }

  58.         m_pData = pValue;
  59.         m_pReference = new KRefCount;
  60.         m_pReference->AddRef();
  61.         return *this;
  62.     }

  63.     T* Get() {
  64.         T* ptr = NULL;
  65.         ptr = m_pData;

  66.         return ptr;
  67.     }

  68.     void Attach(T* pObject) {
  69.         if (m_pReference->Release() == 0) {
  70.             delete m_pData;
  71.             delete m_pReference;
  72.         }

  73.         m_pData = pObject;
  74.         m_pReference = new KRefCount;
  75.         m_pReference->AddRef();
  76.     }

  77.     T* Detach() {
  78.         T* ptr = NULL;

  79.         if (m_pData) {
  80.             ptr = m_pData;
  81.             m_pData = NULL;
  82.             m_pReference->Reset();
  83.         }
  84.         return ptr;
  85.     }

  86. private:
  87.     KRefCount* m_pReference;
  88.     T* m_pData;
  89. };

  90. class CTest {
  91. public:
  92.     CTest(int b) : a(b) {
  93.         cout << "create CTest " << a << endl;
  94.     }
  95.     ~CTest() {
  96.         cout << "delete CTest " << a << endl;
  97.     }
  98. private:
  99.     int a;
  100. };

  101. int main(int argc, char **argv)
  102. {
  103.     SmartPtr<CTest> pSmartPtr1(new CTest(10));
  104.     SmartPtr<CTest> pSmartPtr2(new CTest(20));

  105.     pSmartPtr1 = pSmartPtr2;
  106. }

阅读(693) | 评论(0) | 转发(0) |
0

上一篇:状态模式

下一篇:组合模式

给主人留下些什么吧!~~