(五)适配器模式-C++实现

将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

该模式中有三种角色:

1、目标:是一个抽象类,它是客户想使用的接口

2、被适配者:被适配者是一个已经存在的抽象类或者是接口,需要被适配

3、适配器:适配器是一个类,它继承目标并包含有被适配者的引用。它的职责是将被适配者适配为目标

本例子中的三相电流是目标,现在有洗衣机,可以直接使用三相电流,电视机,可以使用两相电流,现在要将电视机适配为可以直接使用三相电流。实现如下:

(1)Target.h

 1 #ifndef _TARGET_H_
 2 #define _TARGET_H_
 3 #include <iostream>
 4 #include <string>
 5 using namespace std;
 6 //目标 (就是适配成这样的,都使用这种)
 7 class ThreeElectricOutlet{
 8 public:
 9     virtual void connectElectricCurrent() = 0;
10
11 };
12
13 //被适配者 (现在不能使用它,把它适配为可以使用)
14 class TwoElectricOutlet{
15 public:
16     virtual void connectElectricCurrent() = 0;
17 };
18
19 //适配器
20 class ThreeElectricAdapter : public ThreeElectricOutlet{
21 private:
22     TwoElectricOutlet *myOutlet;
23
24 public:
25     ThreeElectricAdapter(TwoElectricOutlet *outlet);
26     void connectElectricCurrent() override;
27 };
28
29 //具体目标
30 class Wash : public ThreeElectricOutlet{
31 public:
32     Wash();
33     Wash(string s);
34     void connectElectricCurrent() override;
35
36 private:
37     string name;
38
39
40 };
41
42 //具体被适配者
43 class Tv : public TwoElectricOutlet{
44 public:
45     Tv();
46     Tv(string s);
47     void connectElectricCurrent() override;
48 private:
49     string name;
50
51 };
52
53
54
55 #endif

(2)Target.cpp

 1 #include "Target.h"
 2
 3 ThreeElectricAdapter::ThreeElectricAdapter(TwoElectricOutlet *outlet)
 4 {
 5     myOutlet = outlet;
 6 }
 7
 8 void ThreeElectricAdapter::connectElectricCurrent()
 9 {
10     myOutlet->connectElectricCurrent();
11 }
12
13 Wash::Wash()
14 {
15     name = "洗衣机";
16 }
17 Wash::Wash(string s)
18 {
19     name = s;
20 }
21
22 void Wash::connectElectricCurrent()
23 {
24     cout << name << "begin wash" << endl;
25 }
26
27 Tv::Tv()
28 {
29     name = "电视机";
30 }
31
32 Tv::Tv(string s)
33 {
34     name = s;
35 }
36
37 void Tv::connectElectricCurrent()
38 {
39     cout << name << "begin play video" << endl;
40 }

(3)AdapterTest.cpp

 1 #include "Target.h"
 2
 3 int main()
 4 {
 5     ThreeElectricOutlet *outlet; //现在只能使用的目标 其它的也将适配为这个目标
 6     Wash *wash = new Wash();    //洗衣机本来就是使用的三相电(即继承的是ThreeElectricOutlet)
 7     outlet = wash;
 8     cout << "use three electric :" << endl;
 9     outlet->connectElectricCurrent();
10
11     Tv *tv = new Tv();        //电视只能使用两相电 现在将其适配为三相电
12     ThreeElectricAdapter *adapter = new ThreeElectricAdapter(tv);
13     outlet = adapter;
14     cout << "use three electric :" << endl;
15     outlet->connectElectricCurrent();
16     return 0;
17 }

适配器模式的关键是建立一个适配器,这个适配器继承了目标接口并且包含被适配者的引用。还可以双向适配,即使用多继承,同时继承目标和被适配者,并且包含目标和被适配者的引用。

时间: 2024-10-08 15:05:46

(五)适配器模式-C++实现的相关文章

php设计模式五----适配器模式

1.简介 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能. 意图:将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 主要解决:主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的. 优点: 1.可以让任何两个没有关联的类一起运行. 2.提高了类的复用. 3.增加了类的透明度. 4.灵活

五分钟一个设计模式之适配器模式

五分钟一个设计模式,用最简单的方法来描述设计模式.查看更多设计模式,请点击五分钟一个设计模式系列 http://blog.csdn.net/daguanjia11/article/category/3259443 认识适配器模式 适配器模式的定义是:将一个类的接口转换成客户端希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 适配器模式的主要功能是转换接口,目的是复用已有功能,而不是实现新接口,适用于功能实现了但接口不兼容的场合.适配器组合了原有对象,并且提

设计模式学习(五) 适配器模式

结构型模式: ---  核心作用:是从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题 ---  分类: 适配器模式,代理模式,桥接模式,装饰模式,组合模式,外观模式,享元模式 适配器模式: 原理: -- 将一个类接口转换成客户希望的另外一个接口. 优点: Adapter模式使得原本由于接口不兼容而不能一起工作的哪些类可以在一起工作 模式中的角色: 目标接口(Target): 客户所期待的接口.目标可以是具体的或抽象的类,也可以是接口 需要适配的类(Adaptee):需要适配

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

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

设计模式(五)——适配器模式

1.描述 将一个类的接口转换成客户希望的另一个接口.Adapter模式使得原本由于接口比兼容而不能一起工作的那些类可以一起工作. 2.优点 ·目标(Target)与被适配者(Adaptee)是完全解耦关系. ·满足"开闭原则" 3.使用情景 一个程序想使用已存在的类,但该类所实现的接口和当前程序所使用的接口不一致. 4.模式的使用 ·目标(Target):目标是一个接口,该接口是客户想使用的接口. ·被适配者(Adapter):被适配者是一个已存在的接口或抽象类,这个接口或抽象类需要适

Java设计模式(五)——适配器模式

先举一个例子解释一下生活中的适配器模式:公司老总要求工程部经理来汇报一下公司内部的消防设备使用和维护情况.接到通知后,工程部经理老宋找了专门负责消防设备统计的维护人员小王,请他调出了去年全年的维护记录.然后老宋前去向总经理汇报工作. 在这个例子中,总经理的任务是:找工程部经理(接口)了解一下消防设备的情况,他可能并不记得谁是工程部经理.老宋(实现类,适配器)发现小王(适配者)其实可以解决这个问题,于是他要求小王提供数据并亲自向总经理做了汇报.对总经理而言,他并不关心工程部经理的具体工作.整个过程

另外五个 PHP 设计模式

设计模式 一书介绍了很多此类概念.当时,我还在学习面向对象 (OO),因此我发现那本书中有许多概念都很难领会.但是,随着越来越熟悉 OO 概念 -- 尤其是接口和继承的使用 -- 我开始看到设计模式中的实际价值.作为一名应用程序开发人员,即使从不了解任何模式或者如何及何时使用这些模式,对您的职业生涯也没有什么大的影响.但是,我发现了解这些模式以及 developerWorks 文章 "五种常见 PHP 设计模式" 中介绍的那些模式的优秀知识后(请参阅 参考资料),您可以完成两件事情:

适配器模式(接口)

一.适配器(Adapter)模式 是把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 二.优点 更好的复用性 系统需要使用现有的类,而此类的接口不符合系统的需要.那么通过适配器模式就可以让这些功能得到更好的复用. 更好的扩展性 在实现适配器功能的时候,可以调用自己开发的功能,从而自然地扩展系统的功能. 三.缺点 过多的使用适配器,会让系统非常零乱,不易整体进行把握.比如,明明看到调用的是A接口,其实内部被适配成了B接口的实现,一个系统如

《Head First 设计模式》之适配器模式与外观模式

适配器模式(Adapter) 适配器(adapter-pattern):将一个类的接口,转换成客户期望的另一个接口.适配器让原来接口不兼容的类可以合作无间.两种形式: 对象适配器(组合) 类适配器(多重继承):在Java中不能实现 外观(facade-pattern):提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更容易使用. 原则 最少知识原则:只和你的密友谈话 要点: 当需要使用一个现有的类而其接口不符合需要时,使用适配器.适配器改变接口以符合客户期望.