C++ 設計模式-》適配器(Adapter)

文件 “F_DesignMode_Adapter_Test.h”

#ifndef F_DESIGN_MODE_ADAPTER_20171016_KJASHD_H_
#define F_DESIGN_MODE_ADAPTER_20171016_KJASHD_H_

/*
設計模式: Adapter適配器模式
http://blog.csdn.net/chenxun_2010/article/details/48383571

1. 作用:將一個類的接口轉換成客戶希望的另外一個接口。Adapter模式使得原本由於接口不兼容而不能一起工作的那些類可以一起工作.
2. 分爲 類適配器模式 和 對象適配器模式。
3. 系統的數據和行爲都正確,但接口不符時,我們應該考慮使用適配器,目的是使控制範圍之外的一個原有對象與某個接口匹配。
4. 適配器模式主要應用於希望複用一些現存的類,但是接口又與複用環境要求不一致的情況.
5. 想使用一個已經存在的類,但如果它的接口,也就是它的方法和你的要求不相同時,就應該考慮用適配器模式.
6. 比如購買的第三方開發組件,該組件接口與我們自己系統的接口不相同,或者由於某種原因無法直接調用該組件,可以考慮適配器.
*/

#if 1
//對象適配器模式
/*

例
在STL中就用到了適配器模式。
STL實現了一種數據結構,稱爲雙端隊列(deque),支持前後兩段的插入與刪除。
STL實現棧和隊列時,沒有從頭開始定義它們,而是直接使用雙端隊列實現的。
隊列用到了它的後端插入,前端刪除。
而棧用到了它的後端插入,後端刪除。
假設棧和隊列都是一種順序容器,有兩種操作:壓入和彈出。

Deque: 被適配的類(目標類, 供應商提供的類)
Sequence: 目標類(用戶使用的類, 用來實現自己想要的操作)
Stack 和 Queue: 適配器(將Deque的操作, 封裝修改後, 提供給Sqquence)
*/

//雙端序列: 被適配的類(目標類, 供應商提供的類)
class Deque
{
public:
    void push_back(const int & nT);
    void push_front(const int & nT);

    void pop_back();
    void pop_front();
};

//目標類(用戶使用的類, 用來實現自己想要的操作)
class Sequence
{
public:
    virtual void pop() = 0;
    virtual void push(const int & nT) = 0;
};

//適配器(將Deque的操作, 封裝修改後, 提供給Sqquence)
//Stack: 先進後出, 後進先出
class Stack: public Sequence
{
public:
    void pop();
    void push(const int & nT);

private:
    Deque m_cDeque;
};

//適配器(將Deque的操作, 封裝修改後, 提供給Sqquence)
//Queue: 先進先出, 後進後出
class Queue: public Sequence
{
public:
    void pop();
    void push(const int & nT);

private:
    Deque m_cDeque;
};

#endif

#endif//F_DESIGN_MODE_ADAPTER_20171016_KJASHD_H_

文件 “F_DesignMode_Adapter_Test.cpp”

#include "stdafx.h"
#include "F_DesignMode_Adapter.h"


void Deque::push_back(const int & nT)
{
    TRACE("Deque: push_back(%d)\n", nT);
}

void Deque::push_front(const int & nT)
{
    TRACE("Deque: push_front(%d)\n", nT);
}

void Deque::pop_back()
{
    TRACE("Deque: pop_back\n");
}

void Deque::pop_front()
{
    TRACE("Deque: pop_front\n");
}

void Stack::pop()
{
    TRACE("Stack: pop\n");
    m_cDeque.pop_back();
}

void Stack::push(const int & nT)
{
    TRACE("Stack: push(%d)\n", nT);

    m_cDeque.push_back(nT);
}

void Queue::pop()
{
    TRACE("Queue: pop\n");
    m_cDeque.pop_front();
}

void Queue::push(const int & nT)
{
    TRACE("Queue: push(%d)\n", nT);
    m_cDeque.push_front(nT);
}

測試文件 “F_DesignMode_Adapter_Test.h”

#ifndef F_DESIGN_MODE_ADAPTER_TEST_20171016_KJASHD_H_
#define F_DESIGN_MODE_ADAPTER_TEST_20171016_KJASHD_H_

#include "F_DesignMode_Adapter.h"

void F_DesignMode_Adapter_Test()
{
    Sequence *pQueue = new Queue;
    pQueue->push(5);
    pQueue->pop();

    delete pQueue;
    pQueue = NULL;

    Sequence *pStack= new Stack;
    pStack->push(5);
    pStack->pop();

    delete pStack;
    pStack = NULL;
}

#endif//F_DESIGN_MODE_ADAPTER_TEST_20171016_KJASHD_H_
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章