两种语言实现设计模式(C++和Java)(四:适配器模式)
参考:http://blog.jobbole.com/109381/
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
系统的数据和行为都正确,但接口不符时,我们应该考虑使用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。
比如购买的第三方开发组件,该组件接口与我们自己系统的接口不相同,或者由于某种原因无法直接调用该组件,可以考虑适配器。
适配器模式分为类模式和对象模式
案例:中国人去欧洲旅游,由于欧标规定双脚电源的都为O字口,而中国人用1字口的充电器,这时中国人给设备充电则需要适配器Dispatcher。
一.类模式
类模式的实现方式为多继承,通过public继承获得接口继承的效果,通过private继承获得实现继承的效果。
C++代码
#include <iostream>
using namespace std;
class IEuropeSocket{
public:
virtual void charge() = ;
};
class ChineseCharger{
public:
void chargeWithFeetFlat(){
cout << "Charge with Chinese charger"<<endl;
}
};
class PowerAdapter:public IEuropeSocket, private ChineseCharger{
public:
virtual void charge(){
cout << "use Chinese charger and a Europe adapter"<< endl;
this->chargeWithFeetFlat();
}
};
int main()
{
PowerAdapter *adapter = new PowerAdapter();
adapter->charge();
return ;
}
Java代码
public interface IEuropeSocket {
void charge();
}
public class ChineseCharger {
void chargeWithFeetFlat(){
System.out.println("Charge with Chinese charger");
}
}
public class PowerAdapter extends ChineseCharger implements IEuropeSocket{
public void charge(){
System.out.println("use Chinese charger and a Europe adapter");
chargeWithFeetFlat();
}
}
public class Main {
public static void main(String[] args){
PowerAdapter adapter = new PowerAdapter();
adapter.charge();
}
}
二.对象模式
对象模式的实现方式为将适配者作为适配器类的成员。
C++代码
#include <iostream>
using namespace std;
class IEuropeSocket{
public:
virtual void charge() = ;
};
class ChineseCharger{
public:
void chargeWithFeetFlat(){
cout << "Charge with Chinese charger"<<endl;
}
};
class PowerAdapter:public IEuropeSocket{
private:
ChineseCharger *m_charger;
public:
PowerAdapter(ChineseCharger* p){m_charger = p;}
virtual void charge(){
cout << "use Chinese charger and a Europe adapter"<< endl;
m_charger->chargeWithFeetFlat();
}
};
int main()
{
PowerAdapter *adapter = new PowerAdapter(new ChineseCharger());
adapter->charge();
return ;
}
Java代码
public interface IEuropeSocket {
void charge();
}
public class ChineseCharger {
void chargeWithFeetFlat(){
System.out.println("Charge with Chinese charger");
}
}
public class PowerAdapter implements IEuropeSocket{
private ChineseCharger charger;
PowerAdapter(ChineseCharger charger) {
System.out.println("use Chinese charger and a Europe adapter");
this.charger = charger;
}
public void charge() {
charger.chargeWithFeetFlat();
}
}
public class Main {
public static void main(String[] args){
PowerAdapter adapter = new PowerAdapter(new ChineseCharger());
adapter.charge();
}
}
两种语言实现设计模式(C++和Java)(四:适配器模式)的更多相关文章
- 两种语言实现设计模式(C++和Java)(一:工厂模式)
本篇开始记录实现设计模式在工作中的两种常见语言上的实现. 本篇介绍最简单的工厂模式. 工厂模式有一种非常形象的描述,建立对象的类就如一个工厂,而需要被建立的对象就是一个个产品:在工厂中加工产品,使用产 ...
- 两种语言实现设计模式(C++和Java)(三:策略模式)
策略模式是指定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化.也就是说这些算法所完成的功能一样,对外的接口一样,只是各自实现上存在差异.用策略模式 ...
- 两种语言实现设计模式(C++和Java)(二:单例模式)
本篇介绍单例模式,可以说是使用场景最频繁的设计模式了.可以根据实例的生成时间,分为饿汉模式和懒汉模式 懒汉模式:饿了肯定要饥不择食.所以在单例类定义的时候就进行实例化. 饿汉模式:故名思义,不到万不得 ...
- 栈的图文解析 和 对应3种语言的实现(C/C++/Java)
概要 本章会先对栈的原理进行介绍,然后分别通过C/C++/Java三种语言来演示栈的实现示例.注意:本文所说的栈是数据结构中的栈,而不是内存模型中栈.内容包括:1. 栈的介绍2. 栈的C实现3. 栈的 ...
- 队列的图文解析 和 对应3种语言的实现(C/C++/Java)
概要 本章和介绍"栈"时的流程一样,先对队列进行介绍,然后分别给出队列的C.C++和Java三种语言的实现.内容包括:1. 队列的介绍2. 队列的C实现3. 队列的C++实现4. ...
- I/O模型系列之四:两种高性能IO设计模式 Reactor 和 Proactor
不同的操作系统实现的io策略可能不一样,即使是同一个操作系统也可能存在多重io策略,常见如linux上的select,poll,epoll,面对这么多不同类型的io接口,这里需要一层抽象api来完成, ...
- 栈的图文解析 和 对应3种语言的实现(C/C++/Java)【转】
概要 本章会先对栈的原理进行介绍,然后分别通过C/C++/Java三种语言来演示栈的实现示例.注意:本文所说的栈是数据结构中的栈,而不是内存模型中栈.内容包括:1. 栈的介绍2. 栈的C实现3. 栈的 ...
- 使用OC和Swift两种语言写一个发射烟花的小项目
OC与Swift两种实现方式基本上区别不大,主要是在一些对象或方法的调用方式不同,附带源码. OC代码样式: self.view.backgroundColor = [UIColor blackCol ...
- 设计模式总结(Java)—— 适配器模式
适配器模式中引入了一个被称为适配器(Adapter)的包装类,而它所包装的对象称为适配者(Adaptee),即被适配的类.适配器的实现就是把客户类的请求转化为对适配者的相应接口的调用.也就是说:当客户 ...
随机推荐
- SWUST OJ(1044)
顺序栈基本操作的实现 #include <iostream> #include <cstdlib> using namespace std; typedef struct st ...
- maven中央仓库地址(支持db2,informix等)
maven中央仓库地址(以下设置写在pom.xml文件里): <repositories> <repository> <id>nexus</id> &l ...
- vue-lazyload懒加载插件的使用
vue-lazyload懒加载插件的使用其实很简单,不想vue-loader官网用法写的那么简单.下面代码演示: 1.安装插件 npm install vue-lazyload --save 2. ...
- leetcode71
这道题很简单,大约是词法分析器差不多的原理.但是我觉得看了别人简洁的代码后还是很有收获的.本人的冗余代码就不好意思放上来了,以下是别人的参考代码和值得借鉴的地方: class Solution { p ...
- [luogu P3960] [noip2017 d2t3] 队列
[luogu P3960] [noip2017 d2t3] 队列 题目描述 Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Syl ...
- kafka AdminClient 闲时关闭连接
AdminClient 类提供了创建.删除 topic 的 api. 在项目中创建了一个 AdminClient 对象,每次创建 topic 时,调用 org.apache.kafka.clients ...
- [转]利用Jenkins的Pipeline实现集群自动化部署SpringBoot项目
环境准备 Git: 安装部署使用略. Jenkins: 2.46.2版本安装部署略(修改jenkins执行用户为root,省得配置权限) JDK: 安装部署略. Maven: 安装部署略. 服务器免密 ...
- Python 安装包报错
以管理员身份运行cmd (requests为为所安装的包名) >>pip install reuqestsCollecting reuqests Could not find a vers ...
- 【cogs247】售票系统【线段树】
售票系统 输入文件:railway.in 输出文件:railway.out 时间限制:1 s 内存限制:128 MB [问题描述] 某次列车途经C个城市,城市编号依次为1到C,列车上共有S个座位,铁路 ...
- 作业:K-means算法应用:图片压缩
from sklearn.datasets import load_sample_image from sklearn.cluster import KMeans import matplotlib. ...