您的位置:首页 > 其它

胖虎白话学习设计模式之适配器设计模式(Adapter)

2014-01-02 21:42 239 查看
胖虎白话学习设计模式之适配器设计模式(Adapter)

记录胖虎学习设计模式过程,不许勿喷,转载请注明出处!

http://blog.csdn.net/ljphhj

1.存在问题
开发中我们经常会遇到一种情况,客户需要实现的一些功能,我们之前编写的类中已经有实现了(不能修改原先设计好的类),
这样已有的类可以提供客户需要的这种功能,只是方法名不同而已.
那为了不重复造轮子,累死累活的,我们需要怎么解决呢?

那么引入解决方法:适配器设计模式

2.适配器设计模式(Adapter)

该设计模式主要用于:当客户需要我们提供接口实现某个功能时,保留现有类提供给我们的服务,向客户提供他所需要的接口,满足客户需求[Adapter模式允许我们使用现存的类来实现客户类的需求]

通俗地打个比方:就跟手机充电一样,无论你是拿到哪种电压环境下(中国(China) 220V 或者 台湾(Taiwan) 110V),只要通过电源适配器的转换就都可以完成对手机的充电,而不会有问题!(PS:充电适配器将电压转换为客户所需要的12V标准电压了)

在该模式中主要涉及到两种:

1.类适配器
当客户在接口中定义了它想要的行为时,我们提供一个新类来实现接口和扩展现有类,这种方法会创建一个类适配器,将客户的接口调用转变成现有类的方法调用.

2.对象适配器
如果客户没有指定所需要的接口,我们可以使用现有类的实例来创建一个新的子类,这个方法会创建一个对象适配器,将客户的调用转变成现有类的实例

UML图讲述该设计模式要点:
图1:类适配器的UML



图2:对象适配器的UML



3.适配器设计模式的例子代码

类适配器例子代码:

package cn.xym.test;

/**
* 客户Client需要的接口方法为:RequiredMethod
* 指定在接口IRequired中
*
* @author 胖虎
*
*/
public class Client {
public void saySomeThing(IRequired it){

it.RequiredMethod();
}
}

package cn.xym.test;

public interface IRequired {
public void RequiredMethod();
}

package cn.xym.test;

/**
* 该类已经存在,并且提供的函数itselfMethod()可以满足客户端的需求
*
* @author 胖虎
*
*/
public class ExistClass {
public void itselfMethod(){
System.out.println("我能满足Client的需求");
}
}

package cn.xym.test;

public class Adapter extends ExistClass implements IRequired{

@Override
public void RequiredMethod() {
/**
* 调用到的是ExistClass中的那个满足Client类的需求的方法
*/
this.itselfMethod();
}
}


对象适配器例子代码:

package cn.xym.test;

/**
* 客户Client可能指定了某个类中的某个方法要实现一个功能
* 这时候不是指定接口,那么我们要实现这个类方法,重用原来的存在类的方法
*
* @author 胖虎
*
*/
public class Client {

public void saySomeThing(RequiredClass it){
it.RequiredMethod();
}
}

package cn.xym.test;

/**
* 该类已经存在,并且提供的函数itselfMethod()可以满足客户端的需求
*
* @author Administrator
*
*/
public class ExistClass {

public void itselfMethod(){
System.out.println("我能满足Client的需求");
}

}

package cn.xym.test;

/**
* 这个类可能是客户那边用了很多年的一个类
* 这个类里面可能有一个方法是满足客户需求的RequiredMethod()
* 但是由于我们现存类实现了这个方法,我们不想再去实现这个方法.
*
* @author 胖虎
*
*/
public class RequiredClass {

public void RequiredMethod(){
//空方法
}

}

package cn.xym.test;

public class Adapter extends RequiredClass {
private ExistClass existClass = null;

public Adapter(ExistClass existClass) {
this.existClass = existClass;
}

//覆盖掉父方法
@Override
public void RequiredMethod() {

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