1. 程式人生 > >C++中設計模式——介面卡模式(Adapter模式)

C++中設計模式——介面卡模式(Adapter模式)

介面卡

概述

介面卡模式將一個類的介面轉換成客戶希望的另外一個介面,使得原本由於介面不相容而不能一起工作的那些類可以一起工作。

用介面卡配出棧和佇列

 用順序表和連結串列適配出棧和佇列。
用介面卡適配出棧

template <class T,class Container> //普通模板引數

class Stack
{
public:
    void StackPush(const T& s){_con.PushBack(s);} //入棧
    void StackPop(){_con.PopBack();}//出棧
    T& StackTop(){return
_con.Back();}//取得棧頂元素 bool StackEmpty(){return _con.Empty();}//判斷棧是否為空 protected: Container _con; //普通模板引數 };

測試

void StackTest()
{
    Stack<int,Vector<int>> s;
    s.StackPush(1);
    s.StackPush(2);
    s.StackPush(3);
    s.StackPush(4);
    s.StackPush(5);

    while (!s.StackEmpty())
    {
        cout
<<s.StackTop()<<" "; s.StackPop(); } cout<<endl; Stack<string,List<string>> s1; s1.StackPush("hello"); s1.StackPush("world"); s1.StackPush("welcome"); s1.StackPush("you"); s1.StackPush("!"); while (!s1.StackEmpty()) { cout
<<s1.StackTop()<<" "; s1.StackPop(); } cout<<endl; }

棧

這樣我們就很輕鬆的利用順序表和連結串列適配出了棧
用介面卡適配出佇列

template<class T,class Container>
class Queue
{
public:
    void PushBack(const T& q){_con.PushBack(q);}//入隊
    void PopFront(){_con.PopFront();}//出隊
    T& Front(){return _con.Front();}//取隊頭元素
    int Size(){return _con.Size();}//求佇列大小
    bool Empty(){return _con.Empty();}//判斷佇列是否為空
protected:
    Container _con;
};

測試

void QueueTest()
{
    Queue<int,Vector<int>> q;
    q.PushBack(1);
    q.PushBack(2);
    q.PushBack(3);
    q.PushBack(4);
    q.PushBack(5);

    while (!q.Empty())
    {
        cout<<q.Front()<<" ";
        q.PopFront();
    }
    cout<<endl;

    Queue<string,List<string>> q1;
    q1.PushBack("change");
    q1.PushBack("my");
    q1.PushBack("world");
    q1.PushBack("come");
    q1.PushBack("on !");

    while (!q1.Empty())
    {
        cout<<q1.Front()<<" ";
        q1.PopFront();
    }
    cout<<endl;
}

佇列
這樣我們就很輕鬆的利用順序表和連結串列適配出了佇列

模板的模板引數

上面看起來已經解決了問題,但是如果我不小心這樣寫了這樣的程式碼:

void QueueTest()
{
    Queue<int,Vector<char>> q; //兩個型別不一樣
    Queue<string,List<int>> q1; //兩個型別不一樣

}

這樣的話是不是就會很坑,妥妥的錯。為了防止你寫出這樣的程式碼,有一種模板引數的方式就杜絕了這種不必要的麻煩。

template <class T,template<class> class Container> //模板的模板引數
class Stack
{
public:
    void StackPush(const T& s){_con.PushBack(s);} //入棧
    void StackPop(){_con.PopBack();}//出棧
    T& StackTop(){return _con.Back();}//取得棧頂元素
    bool StackEmpty(){return _con.Empty();}//判斷棧是否為空
protected:
    Container<T> _con; //模板的模板引數
};

如果這樣寫就很好解決了防止你把型別傳的不一樣而導致不必要的錯誤。

模板的非型別引數

非型別類模板引數

舉個例子,假如你要實現動態陣列,而且在一個函式裡面要用到不同型別的陣列,那我們就可以這樣。直接看程式碼:

template<class T,size_t N>
class Array
{
protected:
    T array[N];
};
非型別函式模板引數
template<class T,size_t N>
T Add(const T& x)
{
    return x+N;
}

非型別模板引數的限制

  • 它可以是常整數(包括enum列舉型別)或者指向外部連結物件的指標。
  • 浮點數和類物件(class-type)不允許作為非型別模板引數
  • 非型別模板引數可以是指標,但該指標必須指向外部連結物件

相關推薦

c++函式的基本用法學生筆記

使用函式首先要定義函式。 例如: void printmessage() { cout<<“How do you do!”<<endl;} 函式呼叫時應明白形式引數和實際引數的區別。 例如: void abc(int a,int b,int c) 其中a,b,c就為形

CC++的一些基礎知識點持續更新

一、識別符號命名: 識別符號指的是函式名,變數名 1、只能包含數字、字母以及下劃線,不能包含其他特殊字元 2、只能以字母或下劃線開頭 3、不能以系統已有的關鍵字重名 二、常見型別的位元組佔用空間: 可以使用sizeof()來檢視所佔用的長度,如下: #include <iost

C++Delete時堆錯誤Heap Corruption的原因

最近這三四天一直在跟一個bug做鬥爭:程式在執行過程中死掉,Output視窗顯示:         1.Windows has triggered a breakpoint in ***, This may be due to a corruption of th

c++的動態記憶體管理new/delete

C++動態記憶體管理 通過new/delete動態管理物件 通過new[]/delete[]動態管理物件陣列 int *p1 = new int; //動態分配4個位元組 int *p2 = new int(1); //動態分配4個位元組,

C#的正則表示式定位元字元

定位元字元 我們經常在正則表示式字串前面加上@字元,這樣不讓編譯器去解析其中的轉義字元,而作為正則表示式的語法(元字元)存在。 字元 說明 \b 匹配單詞的開始或結束 \B 匹配非單詞的開

刨根問底:C++浮點型變數float, double的比較問題。

首先,讓我們先來看一段程式碼: #include <iostream> #include <iomanip> int main() { using namespace std; cout<<setprecision(17);

C++設計模式——介面卡模式Adapter模式

介面卡 概述 介面卡模式將一個類的介面轉換成客戶希望的另外一個介面,使得原本由於介面不相容而不能一起工作的那些類可以一起工作。 用介面卡配出棧和佇列  用順序表和連結串列適配出棧和佇列。 用介面卡適配出棧 template <class

C#設計模式-介面卡模式Adapter Pattern

概念 把一個類的介面變換成客戶端所期待的另一種介面,從而使原本介面不匹配而無法一起工作的兩個類能夠在一起工作。介面卡模式有類的介面卡模式和物件的介面卡模式兩種形式。前者類之間的耦合度比後者高,且要求程式設計師瞭解現有元件庫中的相關元件的內部結構,所以應用相對較少些。 優缺點   優點:     1、將目標類和

C#設計模式之六適配器模式Adapter Pattern【結構型】

優點 繼續 目的 server 詳細 現實生活 態度 lin 設計 原文:C#設計模式之六適配器模式(Adapter Pattern)【結構型】一、引言 從今天開始我們開始講【結構型】設計模式,【結構型】設計模式有如下幾種:適配器模式、橋接模式、裝飾模式、組合模式、外觀

C++重寫《大話設計模式模式例項二工廠模式

下面連結文章是我改寫的簡單工廠模式,可以和工廠模式做對比。 程式:輸入兩個數和運算子,得到 結果。 雖然工廠模式比簡單工廠模式編寫複雜一點,但是它更符合“開放-封閉原則”,就是程式增加功能應該是

重走Java設計模式——介面卡模式Adapter Pattern

介面卡模式 定義 一個類的介面轉換成客戶希望的另外一個介面。介面卡模式使得原本由於介面不相容而不能一起工作的那些類可以一起工作。 結構詳解 介面卡模式有類的介面卡模式和物件的介面卡模式兩種不同的形式。

C++重寫《大話設計模式模式例項四策略模式

(宣告:如果想看例項詳細解析,請看《大話設計模式》,這裡文章只是為了加深學習設計模式印象而自己用C++程式寫一遍,以及把程式碼共享給大家。僅僅是把C#語言換成C++表述,不對書中的程式和例子是否合適做個

C++重寫《大話設計模式模式例項六代理模式

(宣告:如果想看例項詳細解析,請看《大話設計模式》,這裡文章只是為了加深學習設計模式印象而自己用C++程式寫一遍,以及把程式碼共享給大家。僅僅是把C#語言換成C++表述,不對書中的程式和例子是否合適做個

java設計模式介面卡模式Adapter Pattern

介面卡模式 介面卡模式(Adapter Pattern)是作為兩個不相容的介面之間的橋樑。這種型別的設計模式屬於結構型模式,它結合了兩個獨立介面的功能。 這種模式涉及到一個單一的類,該類負責加入獨立的或不相容的介面功能。 例項:MP3播放器可以播放MP3格式的檔案,MP

Objective-C的協議和代理委託設計模式

一、協議:          Objective-C中的協議(Protocol)類似於常用的介面,協議(Protocols)中定義的方法,在類中實現。協議(Protocol)通常用來實現委託物件(Delegate Object)。委託物件(Delegate Object)一

設計模式介面卡模式adapter pattern

介面卡主要用於介面的轉換或者將介面不相容的類物件組合在一起形成對外統一介面,是一種結構性模式,其本質是是一箇中間件,適用於類及其物件。本文希望通過簡單的介紹和分析,能讓讀者對介面卡模式有一個簡單直觀的認識和感知。 1.目的 對現有的類的介面進行轉換以符合新的需求。 2.動機 通過轉換或者組合,間接複用

設計模式實例(Lua)筆記之六Adapter模式

系統 資源管理 公司 個人 title 人的 實例 sel 我們 1.描寫敘述 “我”在 2004 年的時候帶了一個項目,做一個人力資源管理,該項目是我們總公司發起的項目,公司一共同擁有 700 多號人,包含子公司,這個項目還是比較簡單的,分為三大模塊:人員信息管理

介面卡模式 Adapter Pattern

文件地址:《設計模式之禪》​​​​​​​ 切入故事: 業務發展——上帝才能控制 定義: Convert the interface of a class into another interface clients expect.Adapter lets classes

設計模式心得1工廠模式+單例模式+構建器模式+原型模式+介面卡模式

設計模式分類 大致按照模式的應用目標分類,設計模式可以分為建立型模式、結構型模式和行為型模式。 建立型模式,是對物件建立過程的各種問題和解決方案的總結,包括各種工廠模式(Factory、Abstract Factory)、單例模式(Singleton)、構

C++設計模式——模板方法Template Method

模板方法(template method)設計模式用於定義一個包含許多步驟的演算法框架,允許子類重寫(覆蓋)演算法的某一個步驟而不改變演算法整體的流程和框架。 模板方法提供的流程是骨架,子類無須覆蓋模板方法本身,只需繼承即可,即模板方法無須是 virtu