Headfirst设计模式的C++实现——适配器(Adapter)

duck.h

1 #ifndef _DUCK_H_
2 #define _DUCK_H_
3
4 class DUCK {
5 public:
6     virtual void quack() = 0;
7     virtual void fly() = 0;
8 };
9 #endif

mallard_duck.h

 1 #ifndef _MALLARD_DUCK_H_
 2 #define _MALLARD_DUCK_H_
 3
 4 #include "duck.h"
 5 #include <iostream>
 6
 7 class MALLARD_DUCK : public DUCK {
 8 public:
 9     void quack() { std::cout << "mallard duck quack" << std::endl; }
10     void fly() { std::cout << "mallard duck fly" << std::endl; }
11 };
12 #endif

turkey.h

 1 #ifndef _TURKEY_H_
 2 #define _TURKEY_H_
 3
 4 #include <iostream>
 5
 6 class TURKEY {
 7 public:
 8     void gobble() { std::cout << "turkey gobble" << std::endl; }
 9     void fly() { std::cout << "turkey fly" << std::endl; }
10 };
11
12 #endif

turkey_adapter.h

 1 #ifndef _TURKEY_ADAPTER_H_
 2 #define _TURKEY_ADAPTER_H_
 3
 4 #include "turkey.h"
 5 class TURKEY_ADAPTER : public DUCK{
 6 private:
 7     TURKEY &turkey;
 8 public:
 9     TURKEY_ADAPTER( TURKEY &_turkey) : turkey(_turkey) {}
10     void quack() { turkey.gobble(); }
11     void fly() {
12         for ( int i = 0; i < 3; i++ ) {
13             turkey.fly();
14         }
15     }
16 };
17 #endif

main.cpp

 1 #include "mallard_duck.h"
 2 #include "turkey_adapter.h"
 3
 4 void test_duck( DUCK &p ) {
 5     p.quack();
 6     p.fly();
 7 }
 8
 9 int main() {
10     MALLARD_DUCK mallard_duck;
11     test_duck( mallard_duck );
12
13     TURKEY turkey;
14     TURKEY_ADAPTER turkey_adapter(turkey);
15     test_duck( turkey_adapter );
16 }
时间: 2024-10-23 02:22:26

Headfirst设计模式的C++实现——适配器(Adapter)的相关文章

Java设计模式透析之 —— 适配器(Adapter)

今天一大早,你的leader就匆匆忙忙跑过来找到你:"快,快,紧急任务!最近ChinaJoy马上就要开始了,老板要求提供一种直观的方式,可以查看到我们新上线的游戏中每个服的在线人数." 你看了看日期,不是吧!这哪里是马上要开始了,分明是已经开始了!这怎么可能来得及呢? "没关系的."你的leader安慰你道:"功能其实很简单的,接口都已经提供好了,你只需要调用一下就行了." 好吧,你勉为其难地接受了,对于这种突如其来的新需求,你早已习惯. 你的l

Java读源码学设计模式:适配器Adapter

适配器模式相关源码:slf4j-1.6.1.hibernate-3.6.7 大家都知道,log4j是一个广泛使用的日志工具,除此之外,sun公司在JDK中也有自己的日志工具,也就是java.util.logging.Logger.当然还有其他一些日志工具. 多种日志工具功能和使用方式类似,一般都包含debug.info.warn.error等日志级别的方法,但却没有实现共同的接口.这一点不像JDBC,虽然关系型数据库种类很多,例如MySQL.Oracle等,但是有一套统一的接口,也就是JDBC.

设计模式--适配器(Adapter)模式

今天学习另一个设计模式,适配器(Adapter)模式,这是一个共同方向,但有特殊要求,就应用到此设计模式.写到这里,想起很久以前,有写过一篇<ASP.NET的适配器设计模式(Adapter)>http://www.cnblogs.com/insus/archive/2013/02/04/2891426.html ,但是似乎没有适配器的味道. 比如一个系统,开发时设计好各种权限,但某一种,客户提出要求,需要一个特殊的权限来操作.只好开发一个适配器来让其有这个特殊操作权限. 用代码来举例吧. 先定

设计模式学习心得&lt;适配器 Adapter&gt;

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能. 这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能. 概述 意图 将一个类的接口转换成客户希望的另外一个接口. 适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 主要解决 主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的. 何时使用 系统需要使用现有的类,而此类

设计模式(七):Adapter 适配器模式 -- 结构型模式

1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题.程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相关库的发展和进化.  例子1:iphone4,你即可以使用UBS接口连接电脑来充电,假如只有iphone没有电脑,怎么办呢?苹果提供了iphone电源适配器.可以使用这个电源适配器充电.这个iphone的电源适配器就是类似我们说的适配器模式.(电源适配器就是把电源变成需要的电压,也就是适配器的作用是使得一个东西适合另外一个东西.)  例子2:最典型的例

设计模式(九)适配器(结构型)

概述                                                                            将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 角色                                                                           目标接口(Target):客户所期待的接口.目标可以是具体的或抽象

安卓开发笔记——打造万能适配器(Adapter)

为什么要打造万能适配器? 在安卓开发中,用到ListView和GridView的地方实在是太多了,系统默认给我们提供的适配器(ArrayAdapter,SimpleAdapter)经常不能满足我们的需要,因此我们时常要去继承BaseAdapter类去实现一个自定义的适配器来满足我们的场景需要. 如果你是开发一个简单点的APP还好,可能ListView和GridView的数量不会太多,我们只要去写几个BaseAdapter实现类就可以了. 但如果有一天,你需要开发一个APP里面具有几十个ListV

Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---适配器模式之TurkeyAdapter[转]

适配器模式的主要意图是对现有类的接口进行转换,以满足目标类的需求.其次,可以给目标类的接口添加新的行为(主要指方法).这一点容易与装饰模式混淆.从意图方面来看,装饰模式不改变(通常指增加)接口中的行为(主要指方法),而是在原有行为(主要指方法)的基础上添加新的功能:从类结构方面来看,装饰模式中的装饰者既继承又组合被装饰者.类适配器同时继承现有类和目标类,对象适配器继承目标类组合现有类.  1 2{<HeadFirst设计模式>之适配器模式 } 3{ 现有类                   

Headfirst设计模式的C++实现——策略模式(Strategy)

前言 最近在学习<Headfirst设计模式>,里面的例子都是Java的.但是我对Java并不熟悉,所以试着用C++来实现书中的例子. 先来看看Duck以及子类 Duck.h 1 #include <iostream> 2 #include "FlyBehavior.h" 3 4 class Duck 5 { 6 private: 7 FlyBehavior *m_p_fly_behavior; 8 public: 9 virtual void quack()