设计模式之适配器模式

场景

​ 有时,我们需要使用一个工具类的功能,而该类提供的接口却与我们需要的类型不匹配。我们可以通过修改工具类的源码使得该接口兼容我们需要的类型,但前提是我们有这个工具类的源码。然而即使得到了源码,为了实现一个应用,工具类就不得不改变自己的接口,这样做会使得工具类毫无意义。这时,我们需要做的就是定义一个新的类来适配接口。

定义

​ 将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容的类能够一起工作。

结构

​ 适配器的实现有多种:对象适配器与类适配器。其中对象适配器的耦合度较低,所以如果能使用对象适配器的情况,我们都推荐使用对象适配器。

  • Target:我们需要的目标接口。
  • Adaptee:定义一个已经存在的接口,该接口需要适配。
  • Adapter:对Adaptee的接口与Target接口进行适配。
实现

​ 现实中,我们日常使用的三孔插头就有许多不同的版本,而为了能够方便使用,我们可以通过转接头来使用各种插孔,这与适配器模式相同。

  • 对象适配器

Target

class TargetSocket{
  public:
    virtual void socket() = 0;
};

Adaptee

class OwnSocket{
  public:
    void SockeA(){
        std::cout << "SocketType :A" << std::endl;
    }
};

Adapter

class SocketAdapter : public TargetSocket{
  public:
    SocketAdapter():m_socket(new OwnSocket()){}
    ~SocketAdapter(){delete m_socket;}

    void socket(){
      m_socket->SocketA();
    }

  private:
    OwnSocket* m_socket;
};

Client:

int main(){
  TargetSocket* pSocket = new SocketAdapter();

  pSocket->socket();

  return 0;
}
  • 类适配器

Target

class TargetSocket{
  public:
    virtual void socket() = 0;
};

Adaptee

class OwnSocket{
  public:
    void SockeA(){
        std::cout << "SocketType :A" << std::endl;
    }
};

Adapter

class SocketAdapter : public TargetSocket ,OwnSocket{
  public:
    void socket(){
      SocketA();
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员之光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值