设计模式之代理模式、适配器模式和外观模式

编写基于另一组类的包装器接口是一项常见的API设计任务,例如,你的工作可能是维护一个大型的遗留代码库,相比重构所有代码,你更愿意审计一个新的,更简洁的API,以隐藏所有的底层遗留代码;或者你可能已经

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

设计模式之代理模式、适配器模式和外观模式此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“”,获取验证码。在微信里搜索“”或者“”或者微信扫描右侧二维码都可以关注本站微信公众号。

  编写基于另一组类的包装器接口是一项常见的API设计任务,例如,你的工作可能是维护一个大型的遗留代码库,相比重构所有代码,你更愿意审计一个新的 ,更简洁的API,以隐藏所有的底层遗留代码;或者你可能已经编写了一个C++API,后来需要给特定客户提供C接口;或者你的API用到了一个第三方依赖库,你想让客户直接使用此库,但是又不想将此库直接暴露给客户。

  创建包装器API的潜在副作用是影响性能,这主要因为额外增加的一级间接寻址以及存储包装层次状态带来的开销。但就上面提到的那些情而言,这么做可以创建质量更高的,更针对性的API,是物有所值。接下来将按照包装器层和原始接口的差异递增程度依次总结代理模式、适配器模式和外观模式。

1. 代理模式

1.1 类图

  设计模式之代理模式、适配器模式和外观模式

  在上面的基础上添加代理的原始API共享的虚接口,这样做是为了更好地保存这两个API的同步,这么做的前提是你能够修改原始API。

  设计模式之代理模式、适配器模式和外观模式

1.2 代码实现

#pragma once 

#include <iostream>
using namespace std;

class IOriginal
{
public:
    IOriginal()
    {
        cout << "IOriginal Sturuct" << endl;
    }

    virtual ~IOriginal()
    {
        cout << "IOriginal Destruct" << endl;
    }

    virtual void DoSomething() = 0;
};

class COriginal : public IOriginal
{
public:
    COriginal()
    {
        cout << "COriginal Sturuct" << endl;
    }

    ~COriginal()
    {
        cout << "COriginal Destruct" << endl;
    }

    void DoSomething()
    {
        cout << "COriginal DOSomething" << endl;
    }
}

class CProxy : public IOriginal
{
public:
    CProxy()
    {
        m_pOriginal = new COriginal();
        cout << "CProxy Sturuct" << endl;
    }

    ~CProxy()
    {
        if (m_pOriginal != NULL)
        {
            delete COriginal;
            m_pOriginal = NULL;
        }
        cout << "CProxy Destruct" << endl;
    }

    void DoSomething()
    {
        m_pOriginal->DoSomething();
        cout << "CProxy DOSomething" << endl;
    }

private:
    COriginal *m_pOriginal;
}

2. 适配器模式

  适配器设计模式将一个类的接口转换为一个兼容的但不同的接口。与代理模式的相似之处是,适配器设计模式也是一个单一组件包装器,但适配器类和袁石磊的接口可以不相同。

2.1 类图

  设计模式之代理模式、适配器模式和外观模式

2.2 代码实现

设计模式之代理模式、适配器模式和外观模式
设计模式之代理模式、适配器模式和外观模式

#pragma once 

#include <iostream>
using namespace std;

class COriginal
{
public:
    COriginal()
    {
        cout << "COriginal Sturuct" << endl;
    }

    ~COriginal()
    {
        cout << "COriginal Destruct" << endl;
    }

    void DoSomethingA()
    {
        cout << "COriginal DOSomethingA" << endl;
    }
}

class CAdapter
{
public:
    CProxy()
    {
        m_pOriginal = new COriginal();
        cout << "CProxy Sturuct" << endl;
    }

    ~CProxy()
    {
        if (m_pOriginal != NULL)
        {
            delete COriginal;
            m_pOriginal = NULL;
        }
        cout << "CProxy Destruct" << endl;
    }

    void fun()
    {
        //"......"
        m_pOriginal->DoSomethingA();
        cout << "CProxy DOSomething" << endl;
    }

private:
    COriginal *m_pOriginal;
}

View Code

3. 外观模式

  外观模式能够为一组类提供简化的接口。它实际上定义了一个更高层次的接口,以使得底层子系统更易于使用。

3.1 类图

  设计模式之代理模式、适配器模式和外观模式

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/120142.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Java设计模式之创建型:建造者模式

    Java设计模式之创建型:建造者模式

  • 常用设计模式总结

    常用设计模式总结设计模式(Designpattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,是可复用面向对象软件的基础。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中…

  • 二、设计模式-必要的基础知识—旅行前的准备 #和设计模式一起旅行#[通俗易懂]

    设计模式-谈谈模式和设计模式模式(Pattern),指事物的标准样式,百度百科上面说的,其实说白了模式就是我们现在说的套路!模式 == 套路模式是一种思想,说大了特别的复杂和深奥,不管怎么样模式的使用可以解决特定场景下特定的问题!准确表达:模式是在特定环境下人们解决某类重复出现问题的一套成功或有效的解决方案。软件模式那么在软件中使用模式,就是软件模式(Sof…

  • JavaScript 设计模式之组合模式

    JavaScript 设计模式之组合模式引我们知道地球和一些其他行星围绕着太阳旋转,也知道在一个原子中,有许多电子围绕着原子核旋转。我曾经想象,我们的太阳系也许是一个更大世界里的一个原子,地球只是围绕着太阳原子的一个电子。而我身上的每个原子又是一个星系,原子核就是这个星系中的恒星,电子是围绕着恒星旋转的行星。一个电子中也许还包含了另一个宇宙,虽然这个宇宙还不能被显微镜看到,但我相信它的存在。也许这个想法有些异想天开,但在程序设计中,…

  • JAVA设计模式初探之组合模式

    先看看组合模式的定义吧:“将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。”   就拿剪发办卡的事情来分析一下吧。   首先,一张卡可以在总部,分店,加盟店使用,那么总部可以刷卡,分店也可以刷卡,加盟店也可以刷卡,这个属性结构的店面层级关系就明确啦。   那么,总店刷卡消费与分店刷卡消费是一样的道理,那么总店与分店对会员卡的使用

  • 单例设计模式的几种写法(java版本、超详细)

    单例设计模式的几种写法(java版本、超详细)

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号