设计模式学习3:适配器模式

一、适配器模式

适配器模式是一种结构型模式。它通过加入一个适配器,把原本一些不兼容的接口结合到一起,使它们可以一起工作。

二、结构与参与者

Target:定义Client使用的与特定领域相关的接口;
Client:与Target接口对象协同;
Adaptee:一个已经存在的,需要适配的接口;
Adapter:对Adaptee的接口与Target接口进行适配;

三、示例

现有一个解析图片的类PictureResolver,它可以解析bmp和png图片,还有一个可以解析jpg图片的类JPGResolver,它们定义如下:

class PictureResolver {	
public:
	 PictureResolver() {}
	 virtual void resolve(const char *fileName) {
	 	if (fileName.find(".bmp") + 4 == fileName.size()) 
			cout << "resolve bmp picture : " << fileName << endl;
		else if (fileName.find(".png") + 4 == fileName.size())
			cout << "resolve png picture : " << fileName << endl;
	 }
}; 
class JPGResolver {
public:
	JPGResolver() {};
	void resolve(const char *fileName) {
		cout << "resolve jpg picture : " << fileName << endl;
	}
};

想要把解析jpg的功能也加到PictureResolver类里面,这时可以用适配器模式来实现。
先加一个JPGResolver的适配器JPGResolverAdapter 类:

class JPGResolverAdapter {
public:
	JPGResolverAdapter() {}
	JPGResolver jpgResolver;
	void resovle(const char *_fileName) {
		jpgResolver.resolve(_fileName);
	}
};

然后,实现一个有解析jpg功能的PictureResolverWithJPG类:

class PictureResolverWithJPG: public PictureResolver {
public:
    PictureResolverWithJPG() {}
    JPGResolverAdapter jpgResolverAdapter;
    void resolve(const char *_fileName) {
		string fileName = _fileName;
		f (fileName.find(".jpg") + 4 == fileName.size()) 
			jpgResolverAdapter.resovle(_fileName);
		else 
			PictureResolver ::resolve(_fileName);
	}
};

使用

PictureResolverWithJPG*resolver = new PictureResolverWithJPG();
resolver->resolve(“picture.bmp”);
resolver->resolve(“picture.jpg”);

总结

优点:

  1. 把两个没有关联的类一起运行。
  2. 提高了类的服用。
  3. 增加了类的透明度。
  4. 灵活性好。

缺点:

  1. 过多地使用适配器,会让系统变复杂。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值