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

对象适配器:使用组合
类适配器:使用多继承

外观模式:提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。

要点:
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