设计模式(6) - Adapter适配器模式

目录

1.意图

2.UML类图

3.代码实现

4.总结


1.意图

  主要思想是将类的接口转换为客户端所期望的接口。Adapter模式将那些因为接口不同而无法协作的类聚集起来,一起工作。Adapter模式的意图就是,如果可以对接口进行修改,则可以重用已存在的软件。

2.UML类图

  类模式。通过多重继承来实现。通过public获得了接口的继承,通过private获得了实现的继承。


  STL中的stack,就是从vector适配而来的。当stack执行push()操作时,底层的vector执行的是vector::push_back()。

3.代码实现

#include<iostream>

//所需要的接口(目的接口)
class Charger {
public:
	virtual void charge() = 0;
};

//Legacy charger(Adaptee)
class LegacyCharger {
public:
	LegacyCharger(unsigned int mint):minutes(mint){
	}
	void oldCharge() {
		std::cout<<"LegacyCharger: oldCharge()"<<std::endl;
	}
private:
	unsigned int minutes;
};

//Adapter
class ChargerAdapter:public Charger, private LegacyCharger {
public:
	ChargerAdapter(unsigned int mint):LegacyCharger(mint) {
		std::cout<<"ChargerAdapter Constructor"<<std::endl;
	}
	void charge() {
		std::cout<<"ChargerAdapter: charge()"<<std::endl;
		oldCharge();
	}
};

int main()
{
	Charger *cg = new ChargerAdapter(50);
	cg->charge();
	delete cg;
}

  运行结果为:
  ChargerAdapter Constructor
  ChargerAdapter: charge()
  LegacyCharger: oldCharge()

 
  基于运行结果,可以得到下面的分析:
  client认为自己所访问的对象就是Charger.
  ChargerAdapter通过多重继承,实现了让LegacyCharger来实现自己的方法charge(). 但是,LegacyCharger中并没有相同的charger()方法。

4.总结

适配器将一个类的接口,转换为另外的,但是可以兼容的接口。这个方式与proxy代理模式有些类似。但是,其中adapter类的接口与原始类的接口可能是不同的。

通过上面的例子可以看出,适配器模式用于对一个已经存在的API,暴露出一个不同的接口,使得它可以与其它的代码工作。另外,使用适配器模式,可以将各种混杂的接口,进行转换,使得它们可以提供一致的API。

桥接模式与adapter对象有着相似的结构,但是桥接模式的用途不同:它将自己的实现与接口分离,这样实现可以进行不同的变化,相互独立。而适配器意味着改变一个已存在对象的接口。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值