设计模式之适配器模式

在上篇博文中,我们系统地讲述了策略模式,策略模式整体来说应该比较简单,其思想也是很容易弄懂,今天我们再来学习下另外一个模式——适配器模式,适配器模式的定义:适配器模式将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。怎么来讲呢,其实理解它也不难,这个模式有点类似我们日常生活中的“翻译”角色,一般都有一个充当适配功能的角色,再明白一点就是:就是与笔记本电源适配器、手机充电器有点类似,好了,说了这些,下面试试几个有意思的代码吧,代码如下:

1)翻译实例

#ifndef __ADPATER__H
#define __ADPATER__H

#include <iostream>
#include <boost/smart_ptr.hpp>
using namespace std;
using namespace boost;

class Translator
{
    public:
        virtual void speaker() = 0;
};

class ChineseTranslator : public Translator
{
    public:
        void speaker()
        {
            cout<<"chinese speaker hello"<<endl;
        }
};
class JapanTranslator : public Translator
{
    public:
        void speaker()
        {
            cout<<"Japan speaker hello"<<endl;
        }
};
class AmericanTranslator : public Translator
{
    public:
        void speaker()
        {
            cout<<"American speaker hello"<<endl;
        }
};
template<class T>
class Speaker
{
    public:
        Speaker()
        {
            adeptee = shared_ptr<T>(new T());
        }
        void speaker()
        {
            adeptee->speaker();
        }
    private:
        shared_ptr<T> adeptee;
};
#endif
#include "Adapter.h"

int main()
{
    Speaker<ChineseTranslator> chineseTranslator;
    Speaker<JapanTranslator> japanTranslator;
    Speaker<AmericanTranslator> usTranslator;

    chineseTranslator.speaker();
    japanTranslator.speaker();
    usTranslator.speaker();
}

在目标对象中,有一个被称之为“翻译者”的对象,目标对象所有的操作都是以这个翻译者对象基础,写到这里,突然感觉感觉适配器模式有点像之前所说的策略模式,确实有点像,在这里要注意区分,在策略模式里是由用户选择算法,而在适配器里面不存在用户选算法的过程,而是将目标对象转为适配器对象的相关操作,好了,接下来,我们就来实现几个简单的算法题吧,(用两个stack来模拟一个队列和用两个队列来模拟一个stack),代码如下:

1)两个stack模拟一个queue

#ifndef __STACK_QUEUE__H
#define __STACK_QUEUE__H

#include <iostream>
#include <vector>
#include <stack>

using namespace std;

template<class T>
class StackQueue
{
    public:
        StackQueue()
        {
        }
        ~StackQueue(){}

        int size() const
        {
            return front.size() + end.size();
        }

        void enQueue(const T& element)
        {
            end.push(element);
        }

        T deQueue()
        {
            if(front.size() > 0)
            {
                T elem = front.top();
                front.pop();
                return elem;
            }
            else
            {
                while(end.size()>0)
                {
                    front.push(end.top());
                    end.pop();
                }
                T elem = front.top();
                front.pop();
                return elem;
            }
        }
        void showAll()
        {
            while(size() > 0)
            {
                cout<<deQueue()<<" ";
            }
            cout<<endl;
        }
    private:
        stack<T> front;
        stack<T> end;
};
#endif
#include "StackQueue.h"


int main()
{
    StackQueue<int> stackQueue;
    for(int i=1;i<=10;i++)
        stackQueue.enQueue(i);
    cout<<stackQueue.deQueue()<<endl;
    cout<<stackQueue.deQueue()<<endl;

    stackQueue.enQueue(100);
    stackQueue.enQueue(200);

    stackQueue.showAll();
    return 0;
}

测试结果:

1
2
3 4 5 6 7 8 9 10 100 200

2)两个队列模拟一个栈

#ifndef __QUEUE_STACK__H
#define __QUEUE_STACK__H

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

template<class T>
class QueueStack
{
    public:
        QueueStack(){}
        ~QueueStack(){}
        int size()
        {
            return front.size() + end.size();
        }
        void push(T element)
        {
            while(end.size() > 0)
            {
                front.push(end.front());
                end.pop();
            }
            front.push(element);
        }

        T pop()
        {
            T elem;
            while(front.size() > 1)
            {
                end.push(front.front());
                front.pop();
            }

            if(front.size()==1)
            {
                elem = front.front();
                front.pop();
            }

            while(end.size() > 0)
            {
                front.push(end.front());
                end.pop();
            }
            return elem;
        }

        void showAll()
        {
            while(size() > 0)
            {
                cout<<pop()<<" ";
            }
            cout<<endl;
        }

    private:
        queue<T> front;
        queue<T> end;
};
#endif
#include "QueueStack.h"


int main()
{
    QueueStack<int> queueStack;
    for(int i=1;i<10;i++)
        queueStack.push(i);

    cout<<queueStack.pop()<<endl;
    cout<<queueStack.pop()<<endl;

    queueStack.push(100);
    queueStack.push(200);
    queueStack.showAll();
    return 0;
}

测试结果:

9
8
200 100 7 6 5 4 3 2 1


总结

        本篇博文主要分析了下设计模式中的适配器模式,这种模式其实就类似与一个转接口,所有的操作都会被其封装的目标对象代替之,这种模式最大的好处就是很好的实现了封装思想,并且在文章的后半部分我们实现了两个案例,都是比较简单的,其思想就采用了适配器模式,这部分内容还是很简单的,但是如果运用到实际的开发项目中,还得好好的思考下,好了,本篇博文到此结束,下篇博文我们继续分析设计模式之单例模式。

如果需要,请注明转载,多谢   

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值