c++设计模式概述之适配器
类写的不规范(应该屏蔽类的拷贝构造函数和运算符=)。少写点代码,缩短篇幅,重在理解。 实际中可不要这样做。
类比生活中的手机,pad等电源适配器。
简单来讲: 将原本 不匹配 的两者 变的匹配 并且 不影响 原有的逻辑结构
1、分类
A、类适配器
B、对象适配器
C、接口适配器
2、具体
A、类适配器 是通过继承(泛化)实现的。比如, 交流电220v转为5v
// 交流电
class ac220v
{
public:
int get_output()
{
return 220;
}
}; // 直流5V
class dc5v
{
public:
virtual int get_dc_5v() = 0;
}; class power_ada : public ac220v, public dc5v
{
public:
int get_dc_5v()
{
int aaa = ac220v::get_output();
return 5;
}
};
// 调用
void call_power_ada()
{
std::unique_ptr<dc5v> p5v(new power_ada);
if (!p5v)
cout << "\n\n 类适配器创建失败\n\n";
else
cout << p5v->get_dc_5v();
}
B、 对象适配器 器是通过组合来实现适配器功能的,即适配器拥有源角色的实例
class data_operation
{
public:
void set_password(const string str) { this->str_password = str; }
string get_password() { return this->str_password; } virtual string do_encrypt(const int key, const string str) = 0; private:
string str_password;
}; class Caesar
{
public:
string do_encrypt(const int key, const string str)
{
return string("12345678");
}
}; // 加密适配器类
class CipherAdapter : public Caesar, public data_operation
{
public:
string do_encrypt(const int key, const string str)
{
return Caesar::do_encrypt(key, str);
}
}; void call_object_ada()
{
std::unique_ptr<data_operation> pdp(new CipherAdapter);
if (!pdp)
{
cout << "\n\n 创建密文适配器对象失败\n\n";
return;
} pdp->set_password("ABC");
string str = pdp->do_encrypt(1, string("123"));
cout << "密文 = " << str.c_str();
}
C、接口适配器 , 类似pad的充电适配器一样,输出的总是恒定值, 比如,iPhone5s的手机充电线,原版充电线输出位5V。下面演示的是 输出5V,输入可以有多种的电压值的电源适配器。
// 5V接口类
class idc5v
{
public:
virtual int output() = 0;
}; // 电源接口类
class ipower
{
public:
virtual int output() = 0;
}; // 220V 电源
class ac220v : public ipower
{
public:
int output() { return 220; }
}; // 110v 电源
class ac110v : public ipower
{
public:
int output() { return 110; }
}; // 完整的电源适配器
class power_adapter : public idc5v
{
public:
power_adapter( ac220v* pinstance) { this->_ipower = pinstance; }
power_adapter( ac110v* pinstance) { this->_ipower = pinstance; } virtual ~power_adapter()
{
if (nullptr != _ipower)
{
delete _ipower;
_ipower = nullptr;
}
} // 重写基类的函数
int output()
{
int ret_val = 0; if (nullptr == _ipower)
cout << "\n\n\n 创建5v对象失败\n\n\n";
else
{
ret_val = _ipower->output();
// 省略达到5V的操作
ret_val = 5;
} return ret_val;
} private:
ipower *_ipower = nullptr;
}; // 调用电源适配器类
void call_interface_ada_demo()
{
ac220v* pac220 = nullptr;
pac220 = new(std::nothrow) ac220v;
if (nullptr == pac220)
{
cout << "\n\n\n 调用电源适配器: 创建220v对象失败\n\n\n";
return;
} idc5v *pdc5v = new(std::nothrow) power_adapter(pac220); if (nullptr == pdc5v)
{
cout << "\n\n\n 调用电源适配器: 创建220v的电源适配器出错 \n\n\n";
}
else
{
cout << "\n\n\n 调用电源适配器: 输出220v对应的适配结果:" << pdc5v->output();
} // 释放资源
if (nullptr != pdc5v)
{
delete pdc5v;
pdc5v = nullptr;
}
}
c++设计模式概述之适配器的更多相关文章
- java 28 - 1 设计模式 之 面向对象思想设计原则和模版设计模式概述
在之前的java 23 中,了解过设计模式的单例模式和工厂模式.在这里,介绍下设计模式 面向对象思想设计原则 在实际的开发中,我们要想更深入的了解面向对象思想,就必须熟悉前人总结过的面向对象的思想的设 ...
- java设计模式概述
java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式. 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模 ...
- 23种GoF设计模式概述
23种GoF设计模式概述 在前面,我们对 GoF 的 23 种设计模式进行了分类,这里先对各个设计模式的功能进行简要介绍,以便有个大概了解.后面的章节再进行详细介绍. 创建型模式 关注于怎么创建对象的 ...
- Java设计模式(一):设计模式概述、UML图、设计原则
1 设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中. 1977年美国著名建筑大师.加利福尼亚大学伯克利分校环境结构 ...
- 设计模式(一)----设计模式概述及UML图解析
1.设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中. 1977年美国著名建筑大师.加利福尼亚大学伯克利分校环境结构 ...
- OOAD-设计模式(二)之GRASP模式与GOF设计模式概述
一.GRASP模式(通用责任分配软件模式)概述 1.1.理解责任 1)什么是责任 责任是类间的一种合约或义务,也可以理解成一个业务功能,包括行为.数据.对象的创建等 知道责任——表示知道什么 行为责任 ...
- PHP设计模式概述
PHP设计模式概述 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. ...
- 设计模式学习心得<适配器 Adapter>
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能. 这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接 ...
- 001-java 设计模式概述
一.概述 思维导图 GoF(“四人帮”,又称Gang of Four,即Erich Gamma, Richard Helm, Ralph Johnson & John Vlissides) 1 ...
随机推荐
- Codeforces 193D - Two Segments(线段树)
Codeforces 题目传送门 & 洛谷题目传送门 感觉这个 *2900 并不难啊,为什么我没想出来呢 awa 顺便膜拜 ycx 一眼秒掉此题 %%% 首先碰到这类题有两种思路,一是枚举两个 ...
- 55张图吃透Nacos,妹子都能看懂!
大家好,我是不才陈某~ 这是<Spring Cloud 进阶>第1篇文章,往期文章如下: 五十五张图告诉你微服务的灵魂摆渡者Nacos究竟有多强? openFeign夺命连环9问,这谁受得 ...
- R语言与医学统计图形-【25】ggplot图形分面
ggplot2绘图系统--图形分面 ggplot2的分面faceting,主要有三个函数: facet_grid facet_wrap facet_null (不分面) 1. facet_grid函数 ...
- Browse Code Answers
一个记录各种语言可能遇到的问题的论坛 :https://www.codegrepper.com/code-examples/
- mysql数据操作语言DML
插入insert 插入方式1 语法: insert into 表名(列名,....) values(值1,....) 说明: 1.插入的值的类型要与列的类型一致或兼容 2.可以为null的值:①列写了 ...
- 案例 stm32单片机,adc的双通道+dma 内部温度
可以这样理解 先配置adc :有几个通道就配置几个通道. 然后配置dma,dma是针对adc的,而不是针对通道的. 一开始我以为一个adc通道对应一个dma通道.(这里是错的,其实是我想复杂了) 一个 ...
- oracle 锁查询
--v$lock中 id1 在锁模式是 TX 时保存的是 实物id 的前2段SELECT * FROM (SELECT s.SID, TRUNC(id1 / power(2, 16)) rbs, bi ...
- Siebel调用WebService
Siebel可以调用外部系统的接口,通过WebService的接入方式实现,所在的项目都是通过ESB,其他系统的接口都要经过ESB,由ESB提供WSDL文档,通过Siebel调用. 一.修改Tools ...
- easyhadoop 安装
ldconfig deferred processing now taking place正在处理用于 libapache2-mod-php5 的触发器... * Reloading web serv ...
- 【Linux】【Shell】【Basic】文件查找locate,find
1.locate: 1.1. 简介:依赖于事先构建好的索引库: 系统自动实现(周期性任务): 手动更新数据库(updatedb): 1.2. 工作特性:查找速度快:模糊 ...