您的位置:首页 > 其它

适配器模式--把不适合的为己所用

2016-08-22 18:17 148 查看
1)概述

适配器模式又称为转换器模式、变压器模式、包装模式。适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不一起匹配而无法一起工作的两个类能够一起工作。该模式主要通过一个代理Adapter,在原来的类Adaptee和客户之间进行协调,从而达到兼容的母的,其核心是解决一致性的问题。

相似情景:

1.家兴今天去了深圳深圳湾附近的一个篮球场上打球,和一批黑人一起打球,可是呢,家兴虽然打球很厉害,但是英语一点都不行,没法和黑人交流,人家黑人和他说“他打球很厉害”,他完全听不懂,然后旁边的球友说了意思,然后他让球友也和黑人说”你也一样”;这种情况,家兴的球友就充当适配器模式的一个这样的作用。

2.现在市场上主流手机分别是安卓和iphone手机,但是这两种的手机的充电器都是不一样,市场上生产一种接口,就是用安卓手机的数据线加一个小小的接口就给iphone手机充电。

2)提出问题

我们是什么情况下使用呢?

3)简单说明使用场所

当我们需要使用这个类的时候或者是一个对象的时候,但是却不能使用,在短时间不能进行改造,于是我们就需要去适配它了。

适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况下。

同时,适配器是既是类适配器模式,同时也是对象适配器模式

4)结构

Target:目标抽象类,定义客户要用的特定领域接口。

Adaptee:适配者,需要适配接口。

Adapter:适配器,把源接口转换成目标接口,分为类适配器和对象适配器。

5)适配器模式XML图



6)代码展示

//接口
public interface Target {
public void request();
public void specRequest();

}
//对象适配器ObjectAdapter
public class ObjectAdapter implements Target{
private Adaptee adaptee = new Adaptee();

@Override
public void request() {
// TODO Auto-generated method stub
System.out.println("对象适配器:黑人要说话了,哈哈哈");

}

@Override
public void specRequest() {
// TODO Auto-generated method stub
adaptee.specRequest();

}

}

//类适配器ClassAdapter
public class ClassAdapter extends Adaptee implements Target{

@Override
public void request() {
// TODO Auto-generated method stub
System.out.println("类适配器:黑人要说话了,哈哈哈");

}

}

//适配者Adaptee
public class Adaptee {
public void specRequest(){
System.out.println("适配者:家兴要说话了");
}

}

//客户端Client
public class Client {
private static Target cAdapter = new ClassAdapter();
private static Target oAdapter = new ObjectAdapter();

public static void main(String[] args) {
// TODO Auto-generated method stub
cAdapter.request();
cAdapter.specRequest();

oAdapter.request();
oAdapter.specRequest();

}

}


程序执行的结果:

类适配器:黑人要说话了,哈哈哈

适配者:家兴要说话了

对象适配器:黑人要说话了,哈哈哈

适配者:家兴要说话了

通过以上的结果

发现类适配器和对象适配器都能实现一样的效果

类适配器和对象适配器的区别:

对象适配器:使用组合,不仅可以适配某个类,还能适配某个该类的任何子类;只需要写一些代码,将工作委托给被适配器进行,让代码变得更有弹性。

类适配器:不需要重新实现我的整个被适配者,必要的时候可以通过继承的方式覆盖被适配者的行为;比对象适配器更加有效率,只需要一个类适配器,不需要一个适配器和一个类适配器。

7)回归真实

我们面对开发完成后出现的问题,会遇到这样一个问题,有些代码存在枚举器接口中,但是呢我们希望在新的代码中只使用迭代器。这是我们要面对这样一个问题,我们就要考虑过滤器。

Iterator接口有这样三个方法,hasNext,next,remove;而Enumeration接口只有hasMoreElements,nextElement这两个方法;通过观察Enumeration的两个方法很容易映射到Iterator接口中去,但是remove方法就没有,该怎么去处理这问题呢?下面通过代码实现

public class EnumerationIterator implements Iterator{

private Enumeration enumeration;
public EnumerationIterator(Enumeration enumeration){
this.enumeration = enumeration;
}
@Override
public boolean hasNext() {
// TODO Auto-generated method stub
return enumeration.hasMoreElements();
}

@Override
public Object next() {
// TODO Auto-generated method stub
return enumeration.nextElement();
}

@Override
public void remove() {
// TODO Auto-generated method stub
throw new UnsupportedOperationException();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息