设计模式-适配器模式

适配器模式(Adapter Pattern)



1.  目的是什么:

将一个类的借口转换成客户希望的另一种类的借口。通过接口模式的使用,可以使得原来由于接口不兼容而不能正常工作的那些类可以一起工作。

假设有一个接口类Target是客户期望的。

有另一个接口Adaptee,是客户所不能直接对接工作的。

此时客户想对接Adaptee进行工作。

2.  实现思路:

通过将Target里对应的函数设置为虚函数。

并设计Adapter适配器类public继承自Target,private继承自Adaptee类。

这样就实现了Adapter接口类指针可以指向Target类对象,又能在内部执行Adaptee类的行为。

3.  两种模式:

类适配器模式,分别对应于在类定义阶段就实现了适配器模式。

对象适配器模式,在执行过程中,将原来不能直接对接的类的对象,通过对象适配器类动态的对接。

4.  上代码://基于QT

客户原始可对接接口:

H文件

#ifndefADAPTEE_H

#defineADAPTEE_H

 

#include<iostream>

 

usingnamespacestd;

 

classAdaptee

{

public:

    Adaptee();

    virtual~Adaptee();

    virtualvoidspecial_request();

};

 

#endif//ADAPTEE_H

CPP文件

#include"adaptee.h"

 

Adaptee::Adaptee()

{

 

}

 

Adaptee::~Adaptee()

{

 

}

voidAdaptee::special_request()

{

    cout<<"Adaptee::special_request()"<<endl;

}

客户希望对接接口:

H文件

#ifndefADAPTEE_H

#defineADAPTEE_H

 

#include<iostream>

 

usingnamespacestd;

 

classAdaptee

{

public:

    Adaptee();

    virtual~Adaptee();

    virtualvoidspecial_request();

};

 

#endif//ADAPTEE_H

CPP文件

#include"adaptee.h"

 

Adaptee::Adaptee()

{

 

}

 

Adaptee::~Adaptee()

{

 

}

voidAdaptee::special_request()

{

    cout<<"Adaptee::special_request()"<<endl;

}

类适配器接口:

H文件

#ifndefCLASSADAPTER_H

#defineCLASSADAPTER_H

 

#include"target.h"

#include"adaptee.h"

 

 

classclassadapter:publicTarget,privateAdaptee

{

public:

    classadapter();

    virtual~classadapter();

    virtualvoidrequest();

};

 

#endif

CPP文件

#include"classadapter.h"

 

classadapter::classadapter()

{

 

}

 

classadapter::~classadapter()

{

 

}

 

voidclassadapter::request()

{

    cout<<"classadapter::request()"<<endl;

    this->special_request();

    cout<<"-------------------------"<<endl;

}

对象适配器接口

H文件

#ifndefOBJECTADAPTER_H

#defineOBJECTADAPTER_H

 

#include<iostream>

#include"target.h"

#include"adaptee.h"

 

usingnamespacestd;

 

classobjectadapter:publicTarget

{

public:

    objectadapter();

    objectadapter(Adaptee*adaptee);

    virtual~objectadapter();

    virtualvoidrequest();

 

private:

    Adaptee*_adaptee;

};

 

#endif//OBJECTADAPTER_H

CPP文件

#include"objectadapter.h"

 

objectadapter::objectadapter():_adaptee(newAdaptee)

{

 

}

objectadapter::objectadapter(Adaptee*adaptee)

{

    _adaptee=adaptee;

}

objectadapter::~objectadapter()

{

 

}

voidobjectadapter::request()

{

    cout<<"objectadapter::request()"<<endl;

    _adaptee->special_request();

    cout<<"---------------------------"<<endl;

}

 

实验文件

#include<QCoreApplication>

#include<iostream>

#include"target.h"

#include"adaptee.h"

#include"classadapter.h"

#include"objectadapter.h"

 

usingnamespacestd;

 

 

intmain(intargc,char*argv[])

{

    QCoreApplicationa(argc,argv);

    cout<<"Classadapter"<<endl;

    Target*target1=newclassadapter();

    target1->request();

    cout<<endl<<endl;

 

    cout<<"Objectadapter"<<endl;

    Adaptee*adaptee=newAdaptee();

    Target*target2=newobjectadapter(adaptee);

    target2->request();

 

 

    returna.exec();

}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值