设计模式--适配器模式

7 篇文章 0 订阅
7 篇文章 0 订阅

说道适配器模式,又要说到那句老话了。计算机科学领域的任何问题, 都可以通过添加一个中间层来解决。适配器模式也是这样的一个中间层。
那么它的出现主要是要解决什么问题呢?我们现实生活中的太多事软件系统都是按照分层架构来构建的,自顶向下。有时候我们会遇到这样一个问题:现在软件已经写完了,可以正常工作了。但是现在需求发生了变动。之前软件设计的是支持Android平台。现在需要同时支持iOS平台了。但是我们又不想重头来专门为iOS平台写一份。我们想重用原来写好的代码,因为其实很多逻辑都是平台无关的。只有跟系统直接打交道的部分依赖于各个系统的不同实现。那么这个时候我们就可以适当的增加一个适配器层。来适配平台相关的部分。让上层代码对底层代码的调用达到平台无关。者就是适配器的作用。

或者再举个生活中的例子,比如我们在大陆的交流电都是220V的,但是如果我们去到香港,他们就是110V了。这个时候,我们的做法都是带上一个电源适配器,用来做转换。这样就解决了不能充电工作的问题了。
起初我们只有一个Charger类,客户端代码直接创建一个Chager类,然后调用Charging方法。

class Charger {

    public void charging() {
        System.out.println("charging with 220V");
    }
}

public static void main(String[] args) {

        Charger charger = new Charger();
        charger.charging();
    }

输出结果:charging with 220V

现在我要加入一个Charger,工作在110V电压下,我们称它Charger110,然后创建一个Adapter继承自Charger。Adapter里面维护一个Charger110的引用。在Adapter的charging方法中调用Charger110的Charging方法。具体代码如下:

class Charger {

    public void charging() {
        System.out.println("charging with 220V");
    }
}

class Charger110{

    public void charging110() {
        System.out.println("charging with 110V");
    }
}

class Adapter extends Charger{
    private Charger110 charger;

    public Adapter(Charger110 charger) {
        this.charger = charger;
    }

    @Override
    public void charging() {
        charger.charging110();
    }
}

public class AdapterPattern {

    public static void main(String[] args) {
        Charger110 charger110 = new Charger110();
        Charger charger = new Adapter(charger110);
        charger.charging();
    }
}

这样的话我们看到,客户端依然是charger.charging(); 上层代码不需要做改动。就可以工作了。
那下面我们按照惯例我们用C++和C分别来实现一次吧。


class Charger{
public:
    void charging(){
        cout << "charging with 220V\n";
    }
};

class Charger110{
public:
    void charging(){
        cout << "changing with 110V\n";
    }
};

class Adapter : public Charger{
public:
    Adapter(Charger110 *charger){
        this->charger = charger;
    }

    void charging(){
        charger->charging();
    }
private:
    Charger110 *charger;
};

int main(int argc, const char * argv[]) {

    Adapter *adapter = new Adapter(new Charger110());
    adapter->charging();
    return 0;
}

在来看一下C代码吧:

typedef struct _Charger110{
    void (*charging)(struct _Charger110 *charger);
}Charger110;

void charging110(struct _Charger110 *charger){
    printf("charging with 110V\n");
}

Charger110 *newCharger(){
     Charger110 * cha = (Charger110 *)malloc(sizeof(Charger110));
     cha->charging = charging110;
     return cha;
}

typedef struct _Adapter{
    Charger110 * charger;
    void (*charging)(struct _Adapter * adapter);
}Adapter;

void charging_adapter(struct _Adapter * adapter){
    if(adapter != NULL){
        adapter->charger->charging(adapter->charger);
    }
}

Adapter *newAdapter(){
    Adapter * adapter = (Adapter *)malloc(sizeof(Adapter));
    adapter->charger = newCharger();
    adapter->charging = charging_adapter;
    return adapter;
}



int main(int argc, char** argv){

    Adapter *adapter = newAdapter();
    adapter->charging(adapter);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值