• 适配器模式


    在实际软件系统设计和开发中,经常会遇到这样的问题。为了完成快速某项工作,有时会选择购买第三方库。

    但是可能会带来这样的问题:我们的应用程序已设计好的接口和第三方提供的接口不一致。为了让这些接口不兼容的类可以在一起工作,适配器(Adapter)模式就可以大显身手了。 它可以将一个类(第三方库)的接口转化为客户希望的接口。

    适配器模式可以分为两种:类模式的Adapter采用继承的方式继承Adaptee的接口,而对象模式的Adapter则采用组合的方式实现对adaptee的复用。

     以电压转化为例:

    类模式:

    形如:

     代码:

    #include <iostream>
    using namespace std;
    
    class Target
    {
    public:
        virtual ~Target(){}
    public:
        virtual void use5v()
        {
            cout << "工作电压为5v" << endl;
        }
    };
    
    class Adaptee
    {
    public:
        void use220V()
        {
            cout << "工作电压为220v" << endl;
        }
    };
    
    // 适配器
    class Adapter : public Target, private Adaptee
    {
    public:
        virtual void use5v()
        {
            cout << "适配220v" << endl;
            this->use220V();
        }
    
    };
    
    
    void test()
    {
        Target *target = new Adapter();
        target->use5v();
        delete target;
    }
    
    int main()
    {
        test();
        cin.get();
        return 0;
    }

    通过private继承Adaptee获得实现继承的效果,而通过public继承Target实现接口继承的效果

    对象模式:

    代码:

    #include <iostream>
    using namespace std;
    
    class Target
    {
    public:
        virtual ~Target(){}
    public:
        virtual void use5v()
        {
            cout << "工作电压为5v" << endl;
        }
    };
    
    class Adaptee
    {
    public:
        void use220V()
        {
            cout << "工作电压为220v" << endl;
        }
    };
    
    // 适配器
    class Adapter : public Target
    {
    public:
        Adapter(Adaptee *t) :_adaptee(t){}
        virtual void use5v()
        {
            cout << "适配220v" << endl;
            _adaptee->use220V();
        }
    
    private:
        Adaptee *_adaptee;
    };
    
    
    void test()
    {
        Adaptee *adaptee = new Adaptee();
        Target *target = new Adapter(adaptee);
        target->use5v();
        delete adaptee;
        delete target;
    }
    
    int main()
    {
        test();
        cin.get();
        return 0;
    }
  • 相关阅读:
    CentOS部署LAMP环境
    Markdown表格
    Markdown图片
    连接MySQL错误“plugin caching_sha2_password could not be loaded”的解决办法
    使用docker搭建禅道
    高防服务器流量清洗
    流量清洗系统中 netflow方式 和镜像流量方式
    golang 单元测试
    微信公众号创建自定义菜单失败:no permission to use weapp in menu hint?
    Spring常用注解
  • 原文地址:https://www.cnblogs.com/hupeng1234/p/6769997.html
Copyright © 2020-2023  润新知