5.3 适配器模式(4.1)

适配器模式(adapter pattern),又名包装器(Wrapper),是一种“伪装式”委派方式。

问题描写叙述:假定接口Being(生命) 有抽象方法eat()、run(),它的实现类有人/Person、狗/Dog等等;

现有 (第三方) 已经存在的鸟/Bird类,可是Bird拥有的方法头/接口不同样,如eat()和fly();

再比方,程序猿希望将汽车/Car、机器人/Robot……(其它一些你能够想象出来的东西)也“作为”Being来统一处理,当然,它们拥有的方法头/接口各不同样,比如Car有加油/refuel()方法等。

因为希望将Bird、Car、Robot……伪装成为Being以便统一处理,能够将“已经存在的类”再次包装一下,其包装类BirdWrapper、CarWrapper、RobotWrapper等等作为Being的子类。也就是说,外界将BirdWrapper作为Being,而实际上使用了遗留的Bird。

package delegate.adapter;
public class Client{
    public static void main(String args[])	{
		Being b= new BirdWrapper();
		b.eat();
		b.run();
	}
}

easy想象,BirdWrapper改写Being的eat()、run()方法时,将消息转发给被包装的类Bird的相应方法。再比如CarWrapper的eat()实现将调用Car的加油/refuel()方法。

5.3.1 转发的方式

包装类BirdWrapper与遗留类的Bird,既能够是Is-A的继承关系,也能够Has-A的组合关系。

1. Is_A型适配器

当BirdWrapper是一个Bird,意味着Being和Bird均为适配器类BirdWrapper的父类型。通常遗留的Bird是一个类,所以Being必须是一个Java接口。

package delegate.adapter;
public class Bird{
    public void eat(){
		System.out.println("Bird.eat()");
	}

	public void fly()	{
		System.out.println("Bird.fly()");
	}
}
package delegate.adapter;
public class BirdWrapper extends Bird implements Being {
	@Override public void eat()	{ //此方法能够省略
		super.eat();
	}
	@Override public void run()	{
		super.fly(); // super.能够省略
	}
}

Is-A型适配器,在《设计模式》中叫做类适配器。因为採用继承关系,要求Bird类不得为final类——否则无法继承、Bird与Being不得同一时候为类——Java不支持类的多继承。

现有类Bird的方法体是我们须要的,BirdWrapper能够使用改进语义的override——在调用super.eat()的基础上加入型的代码。

被适配的类Bird应该是一个该详细的类。如果Bird有各种子类如麻雀、鸽子等,BirdWrapper将与麻雀、鸽子同等地位,Is-A型适配器无法适配麻雀、鸽子,这时须要使用Has-A型适配器。

2. Has-A型适配器

package delegate.adapter;
public interface Robot{
    public void battery();//电池充电
    public void move();
}
package delegate.adapter;
public class RobotWrapper implements Being{
    private Robot r;
    public RobotWrapper(){
        //任一创建对象的模式
    }
    @Override public void eat()	{
		r.battery();//
	}
	@Override public void run()	{
		r.move();
	}
}

Has-A型适配器,在《设计模式》中叫做对象适配器。因为採用委派关系,被适配的类如Robot能够是一个Java接口或抽象类,Robot拥有自己的类层次。



在[2.1.1空方法的作用]中,介绍了一种伪适配器——JDK中各种窗体控件适配器。值得注意的是,伪适配器模式中,各个类本身构成类层次;而适配器模式中,被适配者通过适配器“伪装”成目标类型(Being)。

双向适配器

时间: 2024-10-05 23:47:56

5.3 适配器模式(4.1)的相关文章

Happy 设计模式之适配器模式(JAVA)

设计模式-适配器模式 适配器模式定义 适配器模式,将一个类的的接口转换成客户或者产品希望的接口形式,就是原本不兼容或者甚至不相干的接口不能一起工作的接口一起工作,完成需求或者客户的需求. 适配器模式的使用场景 1.当你使用一个已经存在的类,而他的接口不符合你的需求. 2.你想要创建一个复用的类,该类可以与其相关的类或者不可见的类协同工作. 适配器角色 Target:目标接口 TargetImpl:目标实现类 Adapter:适配器 Adaptee:被适配者 代码解析: package com.d

Javascript设计模式理论与实战:适配器模式

有的时候在开发过程中,我们会发现,客户端需要的接口和提供的接口发生不兼容的问题.由于特殊的原因我们无法修改客户端接口.在这种情况下,我们需要适配现有接口和不兼容的类,这就要提到适配器模式.通过适配器,我们可以在不用修改旧代码的情况下也能使用它们,这就是适配器的能力. 基本理论 适配器模式:将一个接口转换成客户端需要的接口而不需要去修改客户端代码,使得不兼容的代码可以一起工作. 适配器主要有3个角色组成:(1)客户端:调用接口的类(2)适配器:用来连接客户端接口和提供服务的接口的类(3)适配者:提

适配器模式开发

Adapter模式也叫适配器模式,是构造型模式之一,通过Adapter模式可以改变已有类(或外部类)的接口形式. 在大规模的系统开发过程中,我们常常碰到诸如以下这些情况:我们需要实现某些功能,这些功能已有还不太成熟的一个或多个外部组件, 如果我们自己重新开发这些功能会花费大量时间:所以很多情况下会选择先暂时使用外部组件, 以后再考虑随时替换.避免代码大面积修改Adapter模式就是针对这种类似需求而提出来的.Adapter模式通过定义一个新的接口(对要实现功能加以抽象),和一个实现该接口的Ada

7 结构型模式-----适配器模式

模式动机:有时软件复用的一个难题就是接口的不兼容性,适配器的职责就是为客户提供兼容的适配者接口,使得客户只需访问一类接口就可以调用合适的适配者,而其中的适配细节则有适配器来完成. 模式定义(Adapter Pattern):将一个接口转换为用户期望的接口,使得那些接口不兼容的类可以一起工作. 模式结构图: 模式代码: bt_适配器模式.h: 1 #ifndef AP_H 2 #define AP_H 3 #include <iostream> 4 5 using namespace std;

适配器模式(Adapter)

1.定义: 适配器模式是将一个类的接口转换成客户端希望的另一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 结构与说明: Client:客户端,调用自己需要的领域接口Target. Target:定义客户端需要的跟特定领域相关的接口. Adaptee:已经存在的接口,但与客户端需要的特定领域接口不一致,需要被适配. Adapter:适配器,把Adaptee适配成Client需要的Target. 2.代码示例 (1)已经存在的应用接口,需要被适配的类Adaptee 1

设计模式【适配器模式】

适配器模式的核心思想:把原有的接口转换成调用者所期望的接口,从而使不同接口的类可以一起工作. 在此,需要介绍适配器中包含的3个角色: ■源角色Adaptee:需要适配的目标或接口. ■目标角色Target:所期望得到的接口. ■适配器角色Adapter:适配类是本模式的核心,用来把源接口转换成目标接口,显然这三者的相互关系组成了适配器模式的原型. [转载使用,请注明出处:http://blog.csdn.net/mahoking] 适配器模式也叫做包装器模式(Wrapper),根据适配器对象的不

Java模式(适配器模式)

今天看了下Java中的适配器模式,下面就来小做下总结和谈谈感想,以便日后使用. 首先,先来先讲讲适配器.适配就是由“源”到“目标”的适配,而其中链接两者的关系就是适配器.它负责把“源”过度到“目标”.举个简单的样例,比方有一个“源”是一个对象人,他拥有2种技能各自是说日语和说英语,而某个岗位(目标)须要你同一时候回说日语.英语.和法语,好了,如今我们的任务就是要将人这个“源”适配的这个岗位中,怎样适配呢?显而易见地我们须要为人加入一个说法语的方法,这样才干满足目标的须要. 接着讨论怎样加说法语这

【结构型模式】《大话设计模式》——读后感 (12)在NBA我需要翻译?——适配器模式

适配器模式:将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能在一起工作的 那些类可以在一起工作了[DP] UML类图: 简单模拟一下代码: //已存在的.具有特殊功能.但不符合我们既有的标准接口的类 package com.sjmx.adapter; //已存在的.具有特殊功能.但不符合我们既有的标准接口的类 public class Adaptee { public void specificRequest() { System.out.println

设计模式之四:适配器模式(Adapter Pattern)

在软件系统中,由于应用环境的变化,常常需要将"一些现存的对象"放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的.如果能既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?这就是适配器模式要解决的问题. 目的:将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 下面以日志记录程序为例子说明Adapter模式.假设我们在软件开发中要记录日志,包括数据库记录日志DatabaseLog和文本文件

设计模式之适配器模式与外观模式

适配器模式将一个类的接口,转换成客户期望的另一个接口.适配器让原本接口不兼容的类可以合作无间. 例子:火鸡变鸭子. 先定义一个鸭子接口. package cn.sp.test06; /** * 鸭子 * @author 2YSP * */ public interface Duck { //具备呱呱叫 和 飞行的能力 public void quack(); public void fly(); } package cn.sp.test06; /** * 绿头鸭是鸭子的子类 * @author