zoukankan      html  css  js  c++  java
  • 大话设计模式--适配器模式 Adapter -- C++实现实例

    1.适配器模式: 将一个类的接口转换为客户希望的另一个接口,使得原来由于接口不能一起工作的那些类一起工作。

    适配器模式一般用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。

    适配器模式分为类适配器模式和对象适配器模式。

    应该是双方都不太容易修改的时候再使用适配器模式,这是”亡羊补牢“, 首先应该是设计要完善,再次是重构,最后才是适配器。

    --------------------------------   比较 -------------------------------

    代理模式vs适配器模式vs外观模式

    Posted on 2011-05-24 17:06 李大嘴 阅读(865) 评论(0)编辑 收藏

    一、定义

    代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。

    适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口,使得原本接口不兼容而不能一起工作的那些类可以一起工作。

    外观模式(Facade):为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

    二、理解

    代理模式和适配器模式应该说很相像,但是他们的区别也很明显,代理模式和被代理者的接口是同一个,只是使用中客户访问不到被代理者,所以利用代理间接的访问,而适配器模式,是因为接口不同,为了让用户使用到统一的接口,把原先的对象通过适配器让用户统一的使用,大多数运用在代码维护的后期,或者借用第三方库的情况下,而外观模式,是大家经常无意中使用的,就是把错综复杂的子系统关系封装起来,然后提供一个简单的接口给客户使用,就类似于一个转接口,可以想象成一个漏斗,中间细的那一段,越细耦合度越低,外观模式就是为了降低耦合度。

    ----------------------------------------------------------------------------------

    实例:

    target.h target.cpp 目标接口

    #ifndef TARGET_H
    #define TARGET_H
    
    class Target
    {
    public:
        Target();
        void virtual request();
    };
    
    #endif // TARGET_H
    #include "target.h"
    #include <stdio.h>
    
    Target::Target()
    {
    }
    
    void Target::request()
    {
        printf("normal request 
    ");
    }
    

    adaptee.h adaptee.cpp 特殊接口

    #ifndef ADAPTEE_H
    #define ADAPTEE_H
    
    class Adaptee
    {
    public:
        Adaptee();
        void specificRequest();
    };
    
    #endif // ADAPTEE_H
    #include "adaptee.h"
    #include <stdio.h>
    
    Adaptee::Adaptee()
    {
    }
    
    void Adaptee::specificRequest()
    {
        printf("Specific request
    ");
    }

    adapter.h adapter.cpp适配器

    #ifndef ADAPTER_H
    #define ADAPTER_H
    
    #include "target.h"
    #include "adaptee.h"
    
    class Adapter : public Target
    {
    public:
        Adapter();
        ~Adapter();
        void request();
    
    private:
        Adaptee *adaptee;
    };
    
    #endif // ADAPTER_H
    #include "adapter.h"
    
    Adapter::Adapter()
    {
        adaptee = new Adaptee();
    }
    
    Adapter::~Adapter()
    {
        delete adaptee;
    }
    
    void Adapter::request()
    {
        adaptee->specificRequest();
    }

    main.cpp

    #include <iostream>
    #include "target.h"
    #include "adapter.h"
    using namespace std;
    
    int main()
    {
        cout << "Adapter test!" << endl;
    
        Target *target = new Adapter();
        target->request();
    
        return 0;
    }








     

  • 相关阅读:
    C# 把一个文件夹下所有文件复制到另一个文件夹下 把一个文件夹下所有文件删除(转)
    【总结整理】webGIS学习thinkGIS(四)WebGIS中通过行列号来换算出多种瓦片的URL 之离线地
    ARCGIS空间叠加分析(转)
    ARCGIS中怎么去除重复的面?(转)
    关于写作赚钱(转)
    【总结整理】WebGIS学习-thinkGIS(三):关于影像金字塔、瓦片行列号、分辨率resolution
    【总结整理】WebGIS学习-thinkGIS(地理常识):
    【总结整理】WebGIS学习-thinkGIS(二):关于level,比例尺scale,分辨率resolution
    【总结整理】AMAP学习AMAP.PlaceSearch()
    logging、hashlib、collections模块
  • 原文地址:https://www.cnblogs.com/xj626852095/p/3648184.html
Copyright © 2011-2022 走看看