适配器模式与外观模式
- 适配器模式:将一个类的接口,转换成客户期望的另一个接口,适配器让原本不兼容的类可以合作无间。
- 客户使用适配器的过程如下:
- 客户通过目标接口调用适配器的方法对适配器发出请求
- 适配器使用是陪着接口把请求转换成被适配者的一个或度过调用接口
- 客户接收刀调用的结果,但并未察觉这一切是适配器在转换作用
- 外观模式:外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
- 外观模式没有封装子系统的类,只是提供简化的接口。
- 外观模式体现的设计原则:最少知识原则:只和你的密友谈话。
- 当需要使用一个现有的类而其它接口并不复合你的需要时,就使用适配器。
- 当需要简化并统一一个很大的接口或者一群复杂的接口时,使用外观模式。(外观将客户从一个复杂是子系统中解耦)
模式 | 意图 |
---|
装饰者 | 将一个接口转成另外一个接口 |
适配器 | 不改变接口,但加入责任 |
外观 | 让接口更简单 |
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-65xbKiw7-1663215959140)(img/adapter.png)]](https://i-blog.csdnimg.cn/blog_migrate/23bed59b3586b39595f1f86db16d18a6.png)
class Duck{
public:
virtual ~Duck(){};
virtual void quack()=0;
virtual void fly()=0;
};
class MallerDuck :public Duck{
public:
virtual void quack(){
cout<<" Quack"<<endl;
}
virtual void fly(){
cout<<" i am flying"<<endl;
}
};
class Turkey{
public:
virtual ~Turkey(){};
virtual void gobble()=0;
virtual void fly()=0;
};
class WildTurkey:public Turkey{
public:
virtual void gobble(){
cout<<" Globble gobble"<<endl;
};
virtual void fly(){
cout<<"i am flying a short distance "<<endl;
};
};
class Turkey2Duck:public Duck{
private:
Turkey *m_turkey=nullptr;
public:
Turkey2Duck(Turkey* turkey):m_turkey(turkey){
}
virtual void quack(){
m_turkey->gobble();
}
virtual void fly(){
for(int i=0;i<5;++i)
m_turkey->fly();
}
~Turkey2Duck(){
if(m_turkey!=nullptr){
delete m_turkey;
m_turkey=nullptr;
}
}
};
int main(){
Turkey* turkey=new WildTurkey;
Duck* duck = new MallerDuck;
turkey->fly();
turkey->gobble();
duck->fly();
duck->quack();
Duck* turkey2duck = new Turkey2Duck(turkey);
turkey2duck->quack();
turkey2duck->fly();
system("pause");
return 0;
}