C++实现适配器模式Adapter Pattern

适配器模式将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。

符合OO设计原则:使用对象组合,以修改的接口包装被适配者。被适配者的任何子类,都可以搭配着适配器使用。


当需要使用一个现有的类而其接口并不符合需要时,就使用适配器。

适配器将一个对象包装起来以改变其接口;装饰者将一个对象包装起来以增加新的行为和责任;而外观将一群对象“包装”起来以简化其接口。


#include <iostream>

class Duck {
public:
	virtual void quack() = 0;
	virtual void fly() = 0;
};

class MallardDuck :public Duck {
public:
	void quack() {
		printf("Quack\n");
	}
	void fly() {
		printf("I'm flying\n");
	}
};

class Turkey {
public:
	virtual void gobble() = 0;
	virtual void fly() = 0;
};

class WildTurkey :public Turkey {
public:
	void gobble() {
		printf("Gobble gobble\n");
	}
	void fly() {
		printf("I'm flying a short distance\n");
	}
};

对象适配器

class TurkeyObjectAdapter :public Duck {
private:
	Turkey* m_turkey;
public:
	TurkeyObjectAdapter(Turkey* turkey) {
		m_turkey = turkey;
	}
	void quack() {
		m_turkey->gobble();
	}
	void fly() {
		for (int i = 0; i < 3; i++) {
			m_turkey->fly();
		}
	}
};

类适配器

class TurkeyClassAdapter :public Duck, WildTurkey {
public:

	void quack() {
		WildTurkey::gobble();
	}
	void fly() {
		for (int i = 0; i < 2; i++) {
			WildTurkey::fly();
		}
	}
};

使用者,客户

void testDuck(Duck* duck) {
	duck->quack();
	duck->fly();
}

测试

void main() {
	MallardDuck* duck = new MallardDuck();
	WildTurkey* turkey = new WildTurkey();
	Duck* turkeyObjectAdapter = new TurkeyObjectAdapter(turkey);
	Duck* turkeyClassAdapter = new TurkeyClassAdapter();
	printf("The Turkey says...\n");
	turkey->gobble();
	turkey->fly();

	printf("\nThe Duck says...\n");
	testDuck(duck);
	printf("\nThe turkeyObjectAdapter says...\n");
	testDuck(turkeyObjectAdapter);
	printf("\nThe turkeyClassAdapter says...\n");
	testDuck(turkeyClassAdapter);
}

参考:

1. EricFreeman, FreemanElisabeth, 弗里曼, et al. Head First设计模式[M]. 中国电力出版社, 2007.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值