`

Java设计设计模式之适配器模式(Adaptor)

阅读更多

我的博客自从2008年以后就一直没有持续的维护和更新了,自从2014年离职后回了老家,已经两年时间过去了,重新开启了我的职业生涯,那一切都从头开始吧,博客也继续维护起来。废话少说,我们切入正题。

=============================================================

适配器模式的概念:我不喜欢抠字眼,概念的东西总是给人有玩深沉的感觉,就像纯净水恁说他是氢二氧,喝了可以加速新陈代谢的神奇饮品。看了完全让人蒙圈,其实是故意深沉。

先讲个故事吧,张三是卖馍的,李四是卖腊汁肉的,有一天王麻子跑到李四这里来,说李四我要吃你的腊汁肉,但是光吃肉也没意思,你给我整块馍把肉夹里面,于是李四跑到张三那里买了一个馍。王麻子最终拥有了传说中香喷喷的肉夹馍。李四想想这门生意不错,于是他和张三商量,让张三每天给他批发一些馍,然后李四开始经营传说中百吃不厌的肉夹馍。我们抛开花架看骨架,李四为了解决王麻子的需求将自己卖腊汁肉的能力和张三卖馍的能力结合到了一起,我们可以认为李四在这个事情上做了一个适配。我们把这种模式叫做适配模式。通过这种适配,张三依然是个卖馍的,李四依然是专注他如何做腊汁肉,而王麻子呢,却同时享受了馍的酥软与腊汁肉的齿颊留香。

 

适配器模式分两种:对象适配器和类适配器

 

首先说说类适配器模式,我们也庸俗一把,先看图,再看代码

 

张三、李四、王麻子几个人之间关系的UML如下图所示:

 

 

代码示例如下:

 

首先看看王麻子的需求:

/**
 * 
 */
package adaptorPatternProject;

/**
 * 王麻子作为消费者,既要白吉馍,也要腊汁肉
 * 
 * @author Administrator
 *
 */
public interface WangMaZi {
	
	/**
	 * 有钱就任性,我有钱就有馍
	 * 
	 * @param money
	 * @return
	 */
	public Object woYouMo(int money);
	
	
	/**
	 * 有钱就任性,我有钱就有肉
	 * 
	 * @param money
	 * @return
	 */
	public Object woYouRou(int money);

}

 

说明:王麻子需要解决的是有肉和有馍的需求。

 

再看看张三能提供的能力

/**
 * 
 */
package adaptorPatternProject;

/**
 * 张三的白吉馍店铺
 * 
 * @author Administrator
 *
 */
public class ZhangSan {

	/**
	 * 张三说,我有馍
	 * 
	 * @param money
	 * @return
	 */
	public Object woYouMo(int money){
		
		//这里处理卖馍的逻辑
		
		return null;
	}
}

 王麻子没有找到张三提需求,所以张三一直装作不知道,他只关心他的馍有人买没,他对王麻子没兴趣

 

李四为了能够满足王麻子的需求,于是启动了适配模式:

/**
 * 
 */
package adaptorPatternProject;

/**
 * 李四一个卖腊汁肉的,既解决了王麻子的需求,也让张三的工作更有价值,同时没有偏离自己的主业:卖腊汁肉
 * 
 * @author Administrator
 *
 */
public class LiSi extends ZhangSan implements WangMaZi{

	/* 
	 * 我是个卖肉的,我的专注力就是腊汁肉
	 * 
	 * @see adaptorPatternProject.WangMaZi#woYouRou(int)
	 */
	@Override
	public Object woYouRou(int money) {
		// TODO Auto-generated method stub
		return null;
	}

}

 到了这里,就很清楚了,张三还是卖他做的白吉馍,李四还是专注于他的腊汁肉,只是不同的地方在于,通过他把王麻子和张三之间建立了一种特别微妙的关系,这种关系就是,可能张三这一辈子都不会认识王麻子这个人,但是王麻子这个人只要到李四的店里买了肉夹馍,那馍却一定是李四做的。

 

 

其次说说对象适配器模式,继续庸俗,还是图和代码

 

故事还得从李四开始卖肉夹馍说起,话说自从李四开始卖肉夹馍,生意做的那叫一个风生水起,火的不行,慢慢的张三发现了一个问题,自从李四开始从他这里批发白吉馍,来他店里卖馍的人越来越少,而李四每天从他这里批发的白吉馍却越来越多,于是他算了一笔账,与其自己租店面做馍还不如在李四那里用很便宜的价格租一个摊位,反倒会赚的更多,李四心里想,每次批发还得跑来跑去的,还不如李四在我这里卖馍,反正我有的赚还省事儿了。于是对象适配模式就来了。

 

王麻子的需求没有变化,还是需要馍也需要腊汁肉:

/**
 * 
 */
package adaptorPatternProject;

/**
 * 王麻子作为消费者,既要白吉馍,也要腊汁肉
 * 
 * @author Administrator
 *
 */
public interface WangMaZi {
	
	/**
	 * 有钱就任性,我有钱就有馍
	 * 
	 * @param money
	 * @return
	 */
	public Object woYouMo(int money);
	
	
	/**
	 * 有钱就任性,我有钱就有肉
	 * 
	 * @param money
	 * @return
	 */
	public Object woYouRou(int money);

}

 

张三的需求变了,我要在李四这里开摊位,不过我还是卖白吉馍

/**
 * 
 */
package adaptorPatternProject;

/**
 * 张三的白吉馍店铺
 * 
 * @author Administrator
 *
 */
public class ZhangSan {

	/**
	 * 张三说,我有馍
	 * 
	 * @param money
	 * @return
	 */
	public Object woYouMo(int money){
		
		//这里处理卖馍的逻辑
		
		return null;
	}
}

 

李四这次不再进货而是拿张三的馍直接做,每天和李四按卖馍的数量进行分账

/**
 * 
 */
package adaptorPatternProject;

/**
 * 李四一个卖腊汁肉的,既解决了王麻子的需求,也让张三的工作更有价值,同时没有偏离自己的主业:卖腊汁肉
 * 
 * @author Administrator
 *
 */
public class LiSi implements WangMaZi{
	
	private ZhangSan zhangSan;
	
	/**
	 * @param zhangSan
	 */
	public LiSi(ZhangSan zhangSan){
		this.zhangSan=zhangSan;
	}

	/* 
	 * 我是个卖肉的,我的专注力就是腊汁肉
	 * 
	 * @see adaptorPatternProject.WangMaZi#woYouRou(int)
	 */
	@Override
	public Object woYouRou(int money) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Object woYouMo(int money) {
		// TODO Auto-generated method stub
		return zhangSan.woYouMo(money);
	}

}

 

其实你会发现个问题,好多基本的模式好像项目日常中会突发奇想的这么干了,但是当看到别人给你讲这个什么模式云云,你才发现原来自己无师自通。这个没什么好奇怪的,模式之所以称之为模式,是因为大家觉得这么做好像很有道理,然后一帮老外一遍坐一块儿喝着咖啡一遍给这些常用的典型的编程方法想着名字。然后适配器模式就是这么来了。所以所谓的模式其实就是我们工作当中大家这么玩觉得很有道理,一些人为了能够从方法学的角度把这些经验沉淀下来方便后来的人们少走弯路所以才总结出这么一个东西来。

 

 各位看官,原创不易啊,转载请注明出处: http://danlley.iteye.com 看在打字不易的份上,打赏一个吧

 

 

 

  • 大小: 136.5 KB
  • 大小: 17.3 KB
  • 大小: 18.3 KB
分享到:
评论

相关推荐

    适配器adaptor

    在编程领域,适配器(Adapter)模式是一种结构型设计模式,它允许两个不兼容的接口之间进行通信。在Java中,适配器模式经常被用来解决类与类之间接口不匹配的问题,使得原本无法一起工作的类能够协同工作。本教程将...

    23种java版设计模式源码案例.zip

    23种java版设计模式源码案例.zip 0.目录 创建型模式(creational) 简单工厂(simplefactory) 动态工厂(dynamic) 抽象工厂(abstract) 单例模式(singleton) 建造者模式(builder) 原型模式(prototype) 结构型模式...

    适配器设计模式入门之一

    1.概念:将两个不兼容的类纠合在一起使用,属于结构型模式,需要有Adaptee(被适配者)和Adaptor(适配器)两个身份. 2.为何使用:我们经常碰到要将两个没有关系的类组合在一起使用,第一解决方案是:修改各自类的接口,...

    二十三种设计模式【PDF版】

    设计模式之 Adapter(适配器) 使用类再生的两个方式:组合(new)和继承(extends),这个已经在 thinking in java中提到过. 设计模式之 Proxy(代理) 以 Jive 为例,剖析代理模式在用户级别授权机制上的应用 设计模式之 ...

    adaptor设计模式

    适配器设计模式是软件设计领域中的一种经典模式,它在iOS开发中也广泛应用。适配器模式的主要目的是解决系统中不同组件之间的接口不兼容问题,通过创建一个适配器对象,将原有接口转换为所需的接口,使得原本不兼容...

    51丨适配器模式:代理、适配器、桥接、装饰,这四个模式有何区别?1

    适配器模式是一种结构型设计模式,其主要目的是解决接口不兼容问题,使得原本由于接口差异无法协同工作的类能够一起工作。适配器模式通过创建一个新的类(适配器),将旧的接口转换成目标接口,从而实现了系统的解耦...

    12种设计模式源码

    1. **适配器模式(Adaptor Pattern)**:这种模式用于将两个不兼容的接口进行适配,使得原本不能一起工作的类可以协同工作。在`adaptor`目录下的源码中,你可以看到如何通过创建一个适配器类,将旧的或第三方库的...

    超市管理系统java源码swing-king-design:23种java设计模式

    适配器模式(adaptor) 桥接模式(bridge) 组合模式(composite) 装饰器模式(decorate) 外观模式(facecade) 享元模式(flyweight) 代理模式(proxy) 行为型模式(behaviour) 责任链模式(chainrespon) 命令模式(commond) ...

    0-30 isis_switching_Adaptor_3a_

    描述“Switching adaptor 0-30 volts / 3A”进一步确认了这个适配器的规格,它是一个开关模式电源(Switching Mode Power Supply,简称SMPS),能够提供0到30伏的可调电压,并且最大电流能力为3安培。开关模式电源...

    Ethernet Adaptor网卡驱动

    "Ethernet Adaptor"是网卡的一种类型,指的是遵循以太网标准的网络适配器。以太网是目前最普遍采用的局域网(LAN)技术,其基础是IEEE 802.3标准。本文将深入探讨以太网适配器的工作原理、驱动程序的作用以及如何...

    Android开发框架M-Adaptor

    Android开发框架M-Adaptor是一款专为提升Android应用开发效率而设计的工具,其核心目标是通过利用JavaScript与Activity之间的交互,降低开发者在处理业务逻辑时的编码工作量。这个框架允许开发者用更简洁的方式实现...

    usb 2.0 10 100m ethernet adaptor驱动

    3. **Ethernet Adaptor**:以太网适配器,也称为网卡,是计算机内部用于连接网络的硬件组件。在USB 2.0 10/100M Ethernet Adaptor的案例中,它是一个外部设备,通过USB接口插入计算机,提供网络连接功能,无需内置...

    http-jca-adaptor:HTTP Java 连接器架构 1.6 适配器

    #HTTP 资源适配器 此 HTTP 资源适配器是的实现,使用作为底层 HTTP 实现。 的测试框架用于针对本地嵌入式 8 实例和上的远程 8 实例执行单元测试。 #Building 和已用于开发。 要在上针对远程 WildFly 或 JBoss 实例...

    Qt中DBus的Adaptor-interface通讯方式

    DBus通讯方式中,设置适配器Adaptor和Interface的通讯方式比较麻烦,重点在于适配器类(Adaptor类)和接口类(Interface类)的生成,Qt有工具可以自动生成相应的类。※建议Qt中DBus通讯使用Interface-Connection方式...

    audio_adaptor

    【音频适配器audio_adaptor】是针对CSR公司Audio-Adaptor-SDKRC3.1平台设计的一款专门处理蓝牙音频传输的程序。CSR是一家知名的半导体公司,尤其在蓝牙技术领域有着深厚的积累。此项目旨在为开发者提供一个集成的...

    USB 2.0 10/100M Ethernet Adaptor有线网卡驱动

    2. **10/100M Ethernet**:10/100M指的是适配器支持两种速度模式,10Mbps和100Mbps,是标准以太网速度。它适用于家庭、办公室等场景,能提供稳定且足够的网络速度进行日常上网、文件传输等活动。 3. **有线网卡驱动...

    iterator_adaptor.pdf

    `iterator_adaptor`的设计理念是基于`iterator_facade`,一个用于构建迭代器的基类模板,它定义了迭代器的基本接口。 ### `iterator_adaptor`要求 要使用`iterator_adaptor`,你需要定义一个派生类,该派生类继承...

    usb 2.0 10/100M Ethernet Adaptor驱动

    "外接网卡的驱动"指的是专门为这种通过USB接口连接的外部网络适配器设计的驱动程序。驱动程序是操作系统与硬件设备之间的桥梁,它负责解释并执行来自操作系统的指令,使得硬件能够正常工作。对于USB网卡来说,驱动...

    USB 2.0 10/100M Ethernet Adaptor

    这种适配器是为那些没有内置有线网络接口或者需要额外网络连接的设备设计的,比如笔记本电脑、台式机或者是某些不能直接连接以太网的设备。 描述简短,但我们可以从中推断出几个关键知识点: 1. **USB接口**:USB ...

Global site tag (gtag.js) - Google Analytics