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 ...
随机推荐
- R语言实战-Part 2笔记
R 语言实战(第二版) part 2 基本方法 -------------第6章 基本图形------------------ #1.条形图 #一般是类别型(离散)变量 library(vcd) he ...
- python-django-分页处理
每个模型都有一个管理器,Manager 通过分页可以先加载一部分的数据内容,然后避免大量的查询带来的等待时间 应用场景是,排行榜,前十条或者 for i in range(100): ...: ... ...
- linux下vim的安装与配置(centos)
1.vim的安装 #yum search vim //查看vim相关软件信息 #yum install -y vim* //在线安装vim 2.vim的配置 (1)~/.viminfo 在vim ...
- 11-String to Integer (atoi)
字符串转整型,更新之后的leetcode题,需考虑各种情况, 测试过标准库的atoi函数,当字符串越界返回的值是错的, 而该题要求越界时的返回边界值,更加严谨. Implement atoi to c ...
- mysql 除法运算保留小数的用法
说明:刚开始用的round(值1/值2*100,1) 结果没出效果,才搜到decimal函数 在工作中会遇到计算小数而且需要显现出小数末尾的0,我们会用到DECIMAL这个函数,这是一个函数非常强悍: ...
- List 去重的 6 种方法,这个方法最完美!
在日常的业务开发中,偶尔会遇到需要将 List 集合中的重复数据去除掉的场景.这个时候可能有同学会问:为什么不直接使用 Set 或者 LinkedHashSet 呢?这样不就没有重复数据的问题了嘛? ...
- 分布式服务治理框架Dubbo的前世今生及应用实战
Dubbo的出现背景 Dubbo从开源到现在,已经出现了接近10年时间,在国内各大企业被广泛应用. 它到底有什么魔力值得大家去追捧呢?本篇文章给大家做一个详细的说明. 大规模服务化对于服务治理的要求 ...
- 一次线上GC故障解决过程记录
排查了三四个小时,终于解决了这个GC问题,记录解决过程于此,希望对大家有所帮助.本文假定读者已具备基本的GC常识和JVM调优知识,关于JVM调优工具使用可以查看我在同一分类下的另一篇文章: http: ...
- 巩固javaweb的第二十二天
巩固内容: 使用表单数据 : 要对用户输入的信息进行验证,需要先获取输入信息.每个表单元素都属于一个 form 表单,要获取信息,需要先获取 form,然后访问表单元素的值. 有两种方式可以获取 fo ...
- Spark基础:(五)Spark编程进阶
共享变量 (1)累加器:是用来对信息进行聚合的,同时也是Spark中提供的一种分布式的变量机制,其原理类似于mapreduce,即分布式的改变,然后聚合这些改变.累加器的一个常见用途是在调试时对作业执 ...