适配器模式:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间.
对象适配器:使用组合
类适配器:使用多继承
外观模式:提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
要点:
1.当需要使用一个现有的类而其接口并不符合你的需要时,就使用适配器
2.当需要简化并统一一个很大的接口或者一群很复杂的接口时,使用外观
3.适配器改变接口以符合客户的期望
4.外观将客户从一个复杂的子系统中解耦
5.实现一个适配器可能需要一番功夫,也可能不费功夫,视目标接口的大小与复杂度而定
6.实现一个外观,需要将子系统组合进外观中,然后将工作委托给子系统执行
7.适配器模式有两种形式:对象适配器和类适配器。类适配器需要用到多继承
8.你可以为一个子系统实现一个以上的外观
9.适配器将一个对象包装起来以改变其接口;装饰者将一个对象包装起来以增加新的行为和责任;而外观将一群对象“包装”起来以简化其接口
原则:
只和朋友交谈
[img]http://dl.iteye.com/upload/attachment/510267/ee7b67f1-ea7f-3f15-848d-b41b842237d7.png[/img]
Bird.h
#ifndef BIRD_H
#define BIRD_H
#include<iostream>
using namespace std;
class Bird{
public:
virtual void fly(){
cout << "bird fly" << endl;
}
virtual void eat(){
cout << "bird eat" << endl;
}
};
#endif // BIRD_H
FishAdapter.h
#ifndef FISHADAPTER_H
#define FISHADAPTER_H
#include"Bird.h"
#include"Fish.h"
class FishAdapter:public Bird{
private:
Fish* mFish;
public:
explicit FishAdapter(Fish* fish){
mFish = fish;
}
void fly(){
mFish->swim();
}
void eat(){
mFish->eat();
}
};
#endif // FISHADAPTER_H
Fish.h
#ifndef FISH_H
#define FISH_H
#include<iostream>
using namespace std;
class Fish{
public:
virtual void swim(){
cout << "fish swim" << endl;
}
virtual void eat(){
cout << "fish eat" << endl;
}
};
#endif // FISH_H
Adapter.h
#ifndef ADAPTER_H
#define ADAPTER_H
#include"Fish.h"
#include"Bird.h"
class Adapter:public Fish,Bird{
private:
Fish* mFish;
Bird* mBird;
public:
explicit Adapter(Fish* fish=NULL){
mFish = fish;
}
explicit Adapter(Bird* bird=NULL){
mBird = bird;
}
void fly(){
if(mFish!=NULL){
mFish->swim();
}else{
mBird->fly();
}
}
void swim(){
fly();
}
void eat(){
if(mFish!=NULL){
mFish->eat();
}else{
mBird->eat();
}
}
};
#endif // ADAPTER_H
main.cpp
#include"FishAdapter.h"
#include"Adapter.h"
int main(){
FishAdapter *adapter = new FishAdapter(new Fish);
adapter->fly();
adapter->eat();
Adapter* adp = new Adapter(new Bird);
adp->fly();
adp->eat();
}
fish swim
fish eat
bird fly
bird eat