首页 > 编程 > C++ > 正文

《Head First 设计模式》例子的C++实现(适配器模式)

2019-11-06 07:57:45
字体:
来源:转载
供稿:网友

适配器模式比较简单。就是一种辅助类用一个类来模拟另一个类。C++ 中没有 interface 这个概念,全部用纯虚类来代替。适配器模式的难点在于如何用一种 interface 去模拟另一种 interface,但是这个问题更多的是算法层面的,与设计模式关系不大。

下面是代码:

/// duck.h#ifndef DUCK_H#define DUCK_H#include <iostream>class Duck{public: virtual void quack() = 0; virtual void fly() = 0;};class MallardDuck : public Duck{public: void quack() override { std::cout << "Quack" << std::endl; } void fly() override { std::cout << "I'm flying" << std::endl; }};#endif // DUCK_H///turkey.h#ifndef TURKEY_H#define TURKEY_H#include <iostream>class Turkey{public: virtual void gobble() = 0; virtual void fly() = 0;};class WildTurkey : public Turkey{public: void gobble() override { std::cout << "Gobble gobble" << std::endl; } void fly() override { std::cout << "I'm flying a short distance" << std::endl; }};#endif // TURKEY_H///DuckAdapter.h#ifndef DUCKADAPTER_H#define DUCKADAPTER_H#include "duck.h"#include "turkey.h"class DuckAdapter : public Turkey{public: DuckAdapter(Duck * duck); void gobble() override; void fly() override;PRivate: Duck* m_duck;};#endif // DUCKADAPTER_H///DuckAdapter.cpp#include "duckadapter.h"#include <stdlib.h>DuckAdapter::DuckAdapter(Duck *duck){ m_duck = duck;}void DuckAdapter::gobble(){ m_duck->quack();}void DuckAdapter::fly(){ if(rand() % 5 == 0) { m_duck->fly(); }}///TurkeyAdapter.h#ifndef TURKEYADAPTER_H#define TURKEYADAPTER_H#include "turkey.h"#include "duck.h"class TurkeyAdapter : public Duck{public: TurkeyAdapter(Turkey *turkey); void quack() override; void fly() override;private: Turkey* m_turkey;};#endif // TURKEYADAPTER_H///TurkeyAdapter.cpp#include "turkeyadapter.h"TurkeyAdapter::TurkeyAdapter(Turkey *turkey){ m_turkey = turkey;}void TurkeyAdapter::quack(){ m_turkey->gobble();}void TurkeyAdapter::fly(){ for(int i=0; i < 5; i++) { m_turkey->fly(); }}

最后是测似代码:

#include <iostream>#include "duck.h"#include "turkey.h"#include "duckadapter.h"#include "turkeyadapter.h"using namespace std;void testDuck(Duck &duck){ duck.quack(); duck.fly();}int main(int argc, char *argv[]){ MallardDuck* duck = new MallardDuck(); WildTurkey* turkey = new WildTurkey(); Duck* turkeyAdapter = new TurkeyAdapter(turkey); cout << "The Turkey says..." << endl; turkey->gobble(); turkey->fly(); cout << "/nThe Duck says..." << endl; testDuck(*duck); cout << "/nThe TurkeyAdapter says..." << endl; testDuck(*turkeyAdapter); Turkey *duckAdapter = new DuckAdapter(duck); for(int i=0;i<10;i++) { cout << "The DuckAdapter says..." << endl; duckAdapter->gobble(); duckAdapter->fly(); } return 0;}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选