3.适配器模式

1.适配器模式

  适配器模式将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容一起工作的哪些类可以一起工作。它包括类适配器和对象适配器。

(1)对象适配器

  适配器容纳一个它包裹的类的实例,适配器调用被包裹对象的物理实体

  例:STL中的双端队列,支持前后两端插入与删除。STL实现栈和队列时,没有从头开始定义它们,而是直接使用双端队列实现。这里双端队列就扮演了

    适配器角色。队列用到了它的后端插入,前段删除。而栈用到它的后端插入,后端删除。  

复制代码
//双端队列
class Deque {
public:
    void push_back(int x) { std::cout << "Deque push_back." << std::endl; }
    void push_front(int x) { std::cout << "Deque push_front." << std::endl; }
    void pop_back() { std::cout << "Deque pop_back." << std::endl; }
    void pop_front() { std::cout << "Deque pop_front." << std::endl; }
};

//顺序容器
class Sequence {
public:
    virtual void push(int x) = 0;
    virtual void pop() = 0;
};

//
class Stack : public Sequence {
public:
    void push(int x) { m_deque.push_back(x); }
    void pop() { m_deque.pop_back(); }
private:
    Deque m_deque; //双端队列
};

//队列
class Queue : public Sequence {
public:
    void push(int x) { m_queue.push_back(x); }
    void pop() { m_queue.pop_front(); }
private:
    Deque m_queue; //双端队列
};

int main() {
    Sequence* s1 = new Stack();
    Sequence* s2 = new Queue();
    s1->push(1); 
    s1->pop();
    s2->push(2); 
    s2->pop();
    delete s1;
    delete s2;
    return 0;
}
复制代码

(2)类适配器模式

  适配器继承自己实现的类(一般多重继承)

复制代码
class Target {
public:
    virtual void Request() {}
};

// "Adaptee"
class Adaptee {
public:
    void SpecificRequest() {
        std::cout << "Called SpecificRequest()" << std::endl;
    }
};

// "Adapter"
class Adapter : public Adaptee, public Target {
public:
    void Request() {
        this->SpecificRequest();
    }
};

int main() {
    Target *t = new Adapter();
    t->Request();
    return 0;
}
复制代码

 

posted @   甩锅侠  阅读(230)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示