• 设计模式之实现---适配器模式


    /*****************************************

    CSlot.h

    ****************************************/

    #include <iostream>
    using namespace std;

    //两相的插头基类
    class CTwoSlotsPlug
    {
    public:
     virtual void plugIn2Slots() = 0;
    };

    //一个实插头类:红色的二相插头
    class CRed2SlotsPlug : public CTwoSlotsPlug
    {
    public:
     void plugIn2Slots(){
      cout<<"i'm a 2 slots plug indeed!"<<endl;
     }
    };

    //三相的插头基类
    class CThreeSlotsPlug
    {
    public:
     virtual void plugIn3Slots() = 0;
    };

    /////////////////////////////////////////
    //OK,那么我现在有一个两相的插头,但是插座是三相的
    //所以我们需要一个插头转换器(适配器)来做这个工作。
    class C2to3Slots : public CThreeSlotsPlug  //要伪装成3相的,所以它“是”(is-a)一个3相的接口。
    {
    private:
     //有一个2相的插头类的指针(也可以是引用),这是一个用来被伪装的对象。
     CTwoSlotsPlug* m_2plug;
    public:
     C2to3Slots(CTwoSlotsPlug* inPlug) : m_2plug(inPlug){}

     //伪装函数
     //把CTwoSlotsPlug::plugIn2Slots()伪装成CThreeSlotsPlug::plugIn3Slots()
     void plugIn3Slots(){
      m_2plug->plugIn2Slots();
     }

    };


    //这是一个插座类,只允许插入3相的插头
    class C3HoldSockets
    {
    private:
     CThreeSlotsPlug* m_plugOne;
    public:
     C3HoldSockets(CThreeSlotsPlug* inPlug) : m_plugOne(inPlug){};

     void chargeBattery(){
      m_plugOne->plugIn3Slots();
     } 
    };

    /********************************************

    testAdapterPatten.cpp

    *********************************************/

    /*
        设计模式:适配器模式
      将一个类的接口,转换成客户期望的另一个接口。造配器让原本接口不兼容的类可以合作无间。
      过程:  1. 客户通过目标接口调用适配器的方法对适配器发出请求。 2. 适配器使用被适配者接口把请求转换成被适配者的一个或多个调用接口。 3. 客户接收到调用的结果,但并未察觉这一切是适配器在起转换作用。
      注意: 这个模式是如何把客户和接口绑定起来,而不是和实现绑定起来的。
      适配器模式可以有两种实现方式,分别是对象适配器和类适配器,它们分别用组合和继承的方法实现。对于对象适配器,我认为可以由一个has-a和一个is-a组成。其中has-a是指适配器类需要内含一个被适配对象,其中is-a是指类适配器是某个被伪装的对象。对于类适配器就用多重继承来实现也就是两个is-a。指又是被适配对象,又是被伪装对象。

      by 何戬, hejian@cad.zju.edu.cn
    */
    #include <iostream>
    #include "CSlot.h"
    using namespace std;

    int main()
    {
     //有一个两相的插头
     CTwoSlotsPlug* tsp = new CRed2SlotsPlug();

     //那么我们还需要一个将两相插头插入三相插座的适配器。
     C2to3Slots* adapter = new C2to3Slots(tsp);

     //有一个只适用于三相插头的插座
     C3HoldSockets* hs3 = new C3HoldSockets(adapter);

     hs3->chargeBattery();

     delete hs3;
     delete adapter;
     delete tsp;
     return 0;
    }

  • 相关阅读:
    线段树 建树 单点修改 单点/区间查询
    JAVAEE学期总结
    Spring框架教程IDEA版-----更新中
    第一章操作系统引论-------批处理、分时、实时各个操作系统特点 进程与线程的区别
    读《阿法狗围棋系统的简要分析》
    matlab启动后的默认路径
    从长辈们的故事谈起
    在成为一名老司机的路上不要狂奔
    物理学与其它科学的关系
    读《现象级带货网红的自我修养》
  • 原文地址:https://www.cnblogs.com/skyofbitbit/p/2756617.html
Copyright © 2020-2023  润新知