设计模式之适配器

介绍
  • Adapter即是将一个类的接口转换成客户想要的另一个接口;
  • 当我们想要复用一些现存的类, 但这些类提供的接口又与自己想要用的接口不匹配, 同时又不能改变这些接口时(比如被封装或没不应该为了使用而专门改变一个已有的类), 就可以用Adapter模式;
  • Adapter有类Adapter和对象Adapter两种用法:
    • 类Adapter: 通过多重继承实现, 其优点是简单些, 但缺点是无法利用被适配对象的子类Adaptee
    • 对象Adapter: 通过对象组合实现, 其优点是通过被适配对象的指针,我们可以适用adaptee的子类;
例子
  • 这里给出电源适配器的例子, 美国的家用电压是120V, 中国的电压为220V, 那么问题来了, 我们国内设计的要求输入电压为220V的电脑如何在美国使用? 在美国使用电脑, 不可能让美国人专门为你建一条220V的电路, 也不能让中国的电脑就使用美国的标准, 显然者两者都是不可变得, 但又要使用, 这时适配器的作用就来了;
例子
// 在美国使用电脑, 110V的接口
class ChargeInUSA
{
public:
    ChargeInUSA() {cout<<"in usa we need use 120v voltage to charge the computer"<<endl;}
    virtual void ChargeComInUSA()
    {
        cout<<"charge computer with american principle 120V"<<endl;
    }
};
// 中国充电,220V的接口
class ChargeInChina
{
public:
    void ChargeComInChina()
    {
        cout<<"charge computer with chinese principle 220v"<<endl;
    }
};
// 类适配器
class VoltageAdapter : public ChargeInUSA, private ChargeInChina
{
public:
    virtual void ChargeComInUSA()
    {
        cout<<"using voltage adapter, change 120v to 220v ..."<<endl;
        ChargeComInChina();
    }
};
// 使用
class LiveInUSA
{
public:
    LiveInUSA(){cout<<"live in america, we have different principle with china"<<endl;}
    void SetChrgVol(ChargeInUSA* c){chrg = c;}
    void ChargeCom(){chrg->ChargeComInUSA();}
private:
    ChargeInUSA* chrg;
};
// 如上面的例子, 实际应用中,我们可能会在很多地方用到chrg->ChargeComInUSA(); 那么现在如要使用ChargeComInChina()接口, 显然不能到处取修改已经使用的接口, 那么这里使用适配器则是非常好的设计
int main()
{
    LiveInUSA* xiaoming = new LiveInUSA;
    xiaoming->SetChrgVol(new VoltageAdapter);
    xiaoming->ChargeCom();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值