Adapter模式

适配器模式:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使原本由于接口不兼容而能一起工作的类可以一起工作。

Adapter模式:关键特征

意图:使控制范围之外的一个原有对象与某个接口匹配。

问题:系统的数据和行为都正确,但接口不符。通常用于必须从抽象类派生时。

解决方案:Adapter模式提供了具有所需接口的包装类。

参与者与协作者: Adapter改变了Adaptee的接口,使Adaptee与Adapter的基类Target匹配。这样Client就可以使用Adaptee了,好像它是Target类型。

效果:Adapter模式使原有对象能够适应新的结构,不受其接口的限制。

实现:将原有类包含在另一个类之中。让包含类与需要的接口匹配,调用被包含类的方法。

Adapter模式有两种类型:对象Adapter模式、类Adapter模式。

Facade模式简化了接口,而Adapter模式则将一个已有的接口转换成另一个接口。

场景
相信很多人都知道什么是显卡,也有很多人知道显卡的本名——图形适配器。恩,是的,正好这回说说Apater模式,就拿显卡来例子来分析一下Adapter模式。

我们知道显示器(Client)是用来显示图形的,它是不能显示数据,它只能够接受来自图形发送设备Target的信号。可是我们手头上只有CPU(Adaptee)这个产生各种描述图形的数据的数据发送器。我们需要将这些数据让显示器进行显示,可是这两个部件却是不兼容的。于是我们需要一个中间设备,它能够将CPU“适配”于显示器,这便是我们的显卡——图形适配器(Adapter)。


java 代码

// 图形发送设备
public class Target {
/**
* 传送图形信号
*/
public String request() {
return "Graphic sender";
}
}


java 代码

// 显示器
public class Client {

public static void main(String[] args) {
Target target = new Targete();
System.out.println(target.request());
}
}

可是我们的CPU(Adaptee)只能输出0/1数据,他是个计算器,而不是图形发送设备(Target)。


java 代码

// CPU
public class Adaptee {
/**
* CPU输出的数据
*/
public String getData() {
return "CPU data";
}
}

这个时候我们的显卡(Adapter)的作用便体现出来了,它负责对CPU进行适配,通过将CPU传过来的数据转换成图形信号,从而将CPU伪装成一个图形发送设备。


java 代码

// 显卡,即我们的适配器
public class Adapter extends Target {

// 被代理的设备
private Adaptee apt = null;

/**
* 装入被代理的设备
*/
public Adapter(Adaptee apt) {
this.apt = apt;
}

/**
* 被代理的设备传过来的数据转换成为图形输出
*/
public String request() {
return apt.getData();
}
}

这样,我们的电脑的显示流程就变成CPU-显卡-显示器:


java 代码

public class Client {

public static void main(String[] args) {
// CPU经过显卡的适配后“变”成了图形发送装置了
Target target = new Adapter(new Adaptee());
System.out.println(target.request());
}

}

上面的这种依赖于对象组合的Adapter模式叫做对象适配器(Object Adapter)。它的特征是继承/实现某一方的类(Target),如这里的图形发送器,同时内部包含一个被适配的类(Adaptee),如这里的CPU。通过重写其父类的方法来进行适配。

另一种的Adapter实现
对于Adapter模式,还有另外一种实现方式,这种适配方式叫做类适配器(Class Adapter)。它与Object Adapter的不同之处在于它继承被适配的对象。


java 代码

public class Adapter extends Targer, Adaptee {
......
}

这样的代码在C++中是合法的,但是在Java中规定最多只能继承一个父类,而可以实现多个接口。所以我们需要建立一个IAdaptee的接口,然后将我们的Adapter继承Target同时实现IAdaptee。


java 代码

// IAdaptee接口
public interface IAdaptee {

String getData();
}


java 代码

// Adaptee 实现IAdaptee

public class Adaptee implements IAdaptee {
......
}


java 代码

public class Adapter extends Target implements IAdaptee {

private IAdaptee apt = null;

public Adapter(IAdaptee apt) {
this.apt = apt;
}

public String request() {
return apt.getData();
}

public String getData() {
return apt.getData();
}
}

对于我们的显示器(Client)方面,Class Adapter跟Object Adapter一样,所以不需要进行修改。

对于Class Adapter,大家也看见了,在Adapter中因为是实现了IAdaptee接口,因此需要实现getData()的接口。一旦Target和IAdaptee拥有相同的方法时,会出现麻烦的。所以尽量优先使用Object Adapter的模式。

小结
作为总结,我觉得显卡本身的定义便很能表达Apater设计模式:“它是主机与显示器之间连接的“桥梁”,作用是控制电脑的图形输出,负责将CPU送来的的影象数据处理成显示器认识的格式,再送到显示器形成图象。”


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/mengxinzhangteng/archive/2008/02/25/2118645.aspx
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值