`
airu
  • 浏览: 270789 次
  • 性别: Icon_minigender_1
  • 来自: 云南
社区版块
存档分类
最新评论

每天一个(设计模式)-- Adapter 模式(适配器模式)

 
阅读更多
适配器模式是最常用的设计模式之一。我们随处可以见到他的身影。例如Android中的某些监听器接口,还有著名的ListAdapter。

适配器模式,实际上是一个接口转换模式。也就是我们要把一个接口转换为另外一个接口。也许你要问,为什么要这么做呢? 当然,我们也可以不必这么做,直接实现所需要的接口,不就成了吗? 对于一些教学上的例子来看,确实是这样,但是,如果要转换的接口很复杂,而且,我们很可能只是需要另外一个接口的某些实现,就可以完成新接口的大部分功能,这样的 话,使用了Adapter模式,对于客户端来说,即使Adapter内的实现发生了变化,也并不影响他的继续使用。

简而言之,使用适配器的场景就是: 新接口使用老的实现来过度。做法有两种,
第一: 实现新接口(不是真正的实现,只是看起来像),集成老的实现类。
第二: 实现新接口(该有的方法必须有,内容可空),包含老接口。
这两种类图分别如下:







这两种方法都可以实现Adapter,我更喜欢第二种。优先组合。继承不仅占用了唯一继承权,而且还继承了很多不必要的东西。

下面我们以代码来看看。这个代码使用插座的故事来说明适配器。

首先,很久以前我们的插座是2口的,标准如此。
public interface PowerSocket {
	public static final int FL = 0;
	public static final int ZL = 1;
	public int getFrontLine();
	public int getZeroLine();
}

为了说明问题,方法只是实例而已。我们的插座有两根线,火线零线

然后我们根据这个标准生产了一种插座。GN插座。
public class GNPowerSocket implements PowerSocket{

	@Override
	public int getFrontLine() {
		// TODO Auto-generated method stub
		return PowerSocket.FL;
	}

	@Override
	public int getZeroLine() {
		// TODO Auto-generated method stub
		return PowerSocket.ZL;
	}

}

很好。一切都很顺利。突然,着火了。。。。为了更安全,我们决定加入一个接地的线吧。
于是新的标准出来了。地线是必须的。
public interface NewPowerSocket {
	public static final int GL = 3;
	public int getFrontLine();
	public int getZeroLine();
	public int getGroundLine();
}


然后又有了三个口的插座。很多电器都变成三口了。可是,我觉得再去买三口插座,太贵了。或者某一天我突然到了个陌生的环境中,发现只有两口的插座怎么办?
为了解决这个问题。我只好买了个转换器。两口转三口。
public class SocketAdapter implements NewPowerSocket{
	
	private PowerSocket GNps;
	public SocketAdapter(PowerSocket ps){
		this.GNps = ps;
	}
	@Override
	public int getGroundLine() {
		// TODO Auto-generated method stub
		return NewPowerSocket.GL;
	}

	@Override
	public int getFrontLine() {
		// TODO Auto-generated method stub
		return GNps.getFrontLine();
	}

	@Override
	public int getZeroLine() {
		// TODO Auto-generated method stub
		return GNps.getZeroLine();
	}

}

这里有个小问题,其实这个例子不太合适。稍后再说。

好了,我们看看使用过程。
public class Client {
	public void useSocket(NewPowerSocket nps){
		nps.getFrontLine();
		//dosomething...
		//...
	}
	public static void main(String[] args){
		Client client = new Client();
		PowerSocket ps = new  GNPowerSocket();
		SocketAdapter adapter = new SocketAdapter(ps);
		client.useSocket(adapter);
	}
}


好了,来说说这个例子的问题,其实这个例子中的两个接口,都很小,实现起来超级方便。完全可以直接实现吧。好比这个插座,大家都买三口的吧,花不了几个钱。。。
而且,我们这里的适配器,完全就是一个三口插座。哈哈。
还有,这里使用的委托的方式实现的。

实际情况中,适配器并不一定完全实现接口方法(必须写出方法,内容可以为空),而且复杂的可重用的实现使用老的接口类。所以上面的代码,仅仅是一个了解。
  • 大小: 46.2 KB
  • 大小: 51.4 KB
分享到:
评论

相关推荐

    23种设计模式--适配器模式

    适配器模式是一种软件设计模式,它允许两个不兼容的接口之间进行通信。在软件工程中,这种模式常被用来解决旧系统与新系统、第三方库或者不同组件之间的接口不匹配问题。适配器模式的核心思想是通过创建一个新的类...

    设计模式--适配器模式java例子

    在“设计模式--适配器模式java例子”中,我们可以假设有一个遗留的`OldLibrary`,它的接口与我们当前项目的需求不一致。例如,`OldLibrary`有一个`OldDevice`类,它有一个方法`oldMethod()`,而我们的新系统需要一个...

    设计模式 - 适配器模式(C++实例)

    适配器模式是一种常用的设计模式,它在软件工程中扮演着重要的角色,特别是在解决系统间的兼容性和接口不匹配问题时。适配器模式的核心思想是将一个类的接口转换成客户希望的另一个接口,使原本由于接口不兼容而无法...

    设计模式之 适配器 Adapter C++ 源码

    设计模式之 适配器 Adapter C++ 源码 vs2019 工具,设计模式之 适配器 Adapter C++ 源码 vs2019 工具,设计模式之 适配器 Adapter C++ 源码 vs2019 工具,设计模式之 适配器 Adapter C++ 源码 vs2019 工具,设计模式...

    PHP5设计模式-适配器模式实现

    适配器模式是一种结构型设计模式,它的主要目的是使不兼容的接口能够协同工作。在实际开发中,我们可能会遇到这样的情况:一个类库或者服务提供了一个接口,而我们的代码需要使用另一个接口。适配器模式就充当了两者...

    java常用设计模式-适配器模式

    适配器模式是一种结构型设计模式,它将一个类的接口转换为客户端所期望的另一个接口,以实现不同接口之间的通信。这种模式可以在不修改现有代码的情况下重用现有类,并且可以使不兼容的接口之间进行通信。 适配器...

    c++设计模式-结构型模式-适配器模式

    c++设计模式-结构型模式-适配器模式,其他工程,c++源码。适配器模式(Adapter)的定义如下:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。

    设计模式--适配器模式

    适配器模式是一种常用的设计模式,它在软件工程中扮演着重要的角色,特别是在解决系统间的兼容性和接口不匹配问题时。适配器模式的核心思想是将一个类的接口转换成客户希望的另一个接口,使原本由于接口不兼容而无法...

    设计模式-适配器模式(讲解及其实现代码)

    适配器模式是一种常用的设计模式,它在软件工程中扮演着重要的角色,特别是在处理系统集成、遗留代码重用以及不同接口之间兼容性问题时。适配器模式的主要目的是将两个不兼容的接口融合在一起,使得原本无法直接协作...

    设计模式之--适配器模式

    适配器模式是一种常用的设计模式,它在软件工程中扮演着重要的角色,特别是在解决系统间的兼容性和接口不匹配问题时。适配器模式的核心思想是将一个类的接口转换成客户希望的另一个接口,使原本由于接口不兼容而无法...

    设计模式专题之(八)适配器模式---设计模式适配器模式示例代码(python--c++)

    适配器模式是一种软件设计模式,它允许两个不兼容的接口之间进行通信。在软件开发中,我们常常遇到这样的情况:需要使用一个已经存在的类,但是它的接口与我们的需求不匹配,这时候适配器模式就能派上用场。适配器...

    设计模式 - 适配器

    适配器模式(Adapter Pattern)是一种结构型设计模式,它允许两个不兼容的接口之间进行通信。在实际应用中,我们常常遇到这样的情况:一个系统需要使用现有的类,但其接口与系统的需求不匹配。适配器模式能解决这种...

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

    适配器模式(Adapter Pattern)是软件设计模式中的一种,其主要目的是解决系统中的接口不兼容问题,使得原本由于接口不匹配而无法一起工作的类能够协同工作。在本文中,我们将深入探讨适配器模式的概念、结构、作用...

    设计模式实验报告-适配器模式.docx

    适配器模式(Adapter Pattern)是一种结构型设计模式,其主要目的是将一个类的接口变换成客户端所期待的另一种接口。通过这种方式,原本由于接口不兼容而无法一起工作的类可以顺利合作。适配器模式有两种实现方式:...

    c++-设计模式之适配器模式(Adapter Pattern)

    适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个接口转换为客户端期望的另一个接口。适配器模式常用于解决由于接口不兼容而无法正常工作的类之间的协作问题。 适配器模式的组成 目标接口(Target...

    C++设计模式--基于Qt4开源跨平台开发框架

    而Qt4作为一个强大的开源库,提供了丰富的功能,使得开发者能够在多个操作系统上构建用户界面和应用程序。 首先,我们要理解设计模式的基本类型,包括创建型、结构型和行为型模式。创建型模式如单例模式(Singleton...

    java设计模式之适配器模式

    适配器模式是一种在软件工程中广泛使用的结构型设计模式,它允许两个不兼容的接口之间进行通信。在Java中,适配器模式扮演着重要的角色,尤其在处理遗留代码或者第三方库集成时,能够有效地解决接口不匹配的问题。...

    8.设计模式-适配器模式1

    适配器模式是一种软件设计模式,它允许不同的接口或类之间进行通信,即使它们的接口不兼容。适配器模式的核心思想是通过创建一个适配器类,将原有类的接口...在软件开发中,适配器模式是一个值得掌握的重要设计模式。

    TP-LINK WIRELESS USB ADAPTER无线驱动程序

    "TP-LINK WIRELESS USB ADAPTER无线驱动程序"是专为TP-LINK品牌的无线USB适配器设计的重要软件组件,用于确保设备能够与计算机操作系统正确通信并实现无线网络连接。 无线USB适配器是将电脑连接到Wi-Fi网络的一种...

    讲故事,学(Java)设计模式-适配器模式Java开发Ja

    类适配器模式通常涉及到接口的继承,例如,假设有一个旧的`OldDevice`接口,它与新的`NewDevice`接口不兼容,我们可以通过创建一个适配器类`Adapter`,继承`OldDevice`并实现`NewDevice`,这样`Adapter`就可以作为`...

Global site tag (gtag.js) - Google Analytics