您的位置:首页 > 职场人生

程序员的成长之路:设计模式:适配器模式

2017-03-21 23:24 337 查看
适配器模式

将一个类的接口转换成客户希望的另外一个接口。使得不兼容的两个类可以一起工作.

在实际开发中,我们实现某一需求经,会发现项目中已经有一个满足需求的类,但是这个类与我们希望的接口不兼容,这个时候我们就可以使用适配器模式.

场景:一个已有的项目中,其日志记录的实现方式是保存txt文件,而客户希望提供xml的方式,以后很可能也需要持久化到数据库的方式,由于txt的方式已经实现了,基于OCP原则,我们不应该因为改变而修改txt类的实现,我们可以使用适配器模式,设计一个适配器,来适配不同的日志方式.

适配器模式的实现方式有很多种,其目的就是使得两个不兼容的类可以一起工作.

基于类的适配

1 创建一个xml日志的接口,抽象xml日志方法

2 创建一个适配器类,实现已有类和xml日志接口,并实现xml日志方法

这样适配器就可以同时支持 txt和xml的日志操作,但是java是单继承多实现的,如果xml和txt都已经实现,需要添加数据库的日志方式,那怎么办呢

基于对象的适配

1 创建一个适配器接口,抽象所有源对象的方法,即 txt xml 的日志操作方法

2 创建适配器实现类,持有所有源对象,即 Adapter中添加成员变量  xmlLog dbLog txtLog

3 与源对象相关的方法中,返回所持有源对象对应方法的结果
即 xmlLog()  return this.xmlLog.xmllog()

4 添加并实现数据库日志操作方法

SpringMVC的适配

1 创建适配器接口,提供2个方法

supprots(Handler handler) 用于判断handler是否指定的类型.

handler(Handler handler) 用于执行对应handler中的方法

2 实现多个适配器,1个适配器对应一个处理器(Handler)

3 调用类

// 创建一个适配器链,用于存放适配器

// 创建处理器

// 遍历适配器链,调用supprots(handler)方法

//
如果为true 则返回适配器

//
调用适配器的handler来执行处理器

public class AdapterMain {

// 创建一个适配器链,用于存放适配器
private final static List<HandlerAdapter> handlerAdapters = new ArrayList<HandlerAdapter>();

public static void main(String[] args) {

handlerAdapters.add(new HttpAdapter());
handlerAdapters.add(new AnnotationAdapter());
handlerAdapters.add(new SimpleAdapter());

// 方便测试:创建一个集合存放所有处理器,并随机创建一个controller类
for (int i = 0; i < 10; i++) {
List<Handler> handlers = new ArrayList<Handler>();
handlers.add(new HttpController());
handlers.add(new SimpleController());
handlers.add(new AnnotationController());
Random random = new Random();
int next = random.nextInt(3);
Handler handler = handlers.get(next);
HandlerAdapter adapter = adapter(handler);
if (adapter != null) {
adapter.handle(handler);
}
}

}

// 执行适配的方法
public static HandlerAdapter adapter(Object handler) {
// 遍历适配器链
for (HandlerAdapter adapter : handlerAdapters) {
// 判断是否与处理器适配
if (adapter.supports(handler)) {
// 适配成功,返回适配器
return adapter;
}
}
// 适配失败,返回null
return null;
}
}


/**
* 适配器接口
* @explain
* @author Created by Vision Ho 2017年3月21日
*/
public interface HandlerAdapter {

/**
* 用于执行与适配器对应的处理器类的方法
* @param handler
* @author Vision
*/
public void handle(Object handler);

/**
* 用于判断handler(controller)是否适配器所对应的类型
* @param handler
* @return
* @author Vision
*/
public boolean supports(Object handler);
}

public class SimpleAdapter implements HandlerAdapter {

@Override
public void handle(Object handler) {
((SimpleController) handler).doSimplerHandler();
}

@Override
public boolean supports(Object handler) {
return (handler instanceof SimpleController);
}

}
public class AnnotationAdapter implements HandlerAdapter {

@Override
public void handle(Object handler) {
((AnnotationController) handler).doAnnotationHandler();
}

@Override
public boolean supports(Object handler) {
return (handler instanceof AnnotationController);
}

}

public class HttpAdapter implements HandlerAdapter {

@Override
public void handle(Object handler) {
((HttpController)handler).doHttpHandler();
}

@Override
p
ae7d
ublic boolean supports(Object handler) {
return (handler instanceof HttpController);
}
}

public interface Handler {

}

public class SimpleController implements Handler {
public void doSimplerHandler() {
System.out.println("simple...");
}
}

public class HttpController implements Handler {
public void doHttpHandler() {
System.out.println("http...");
}
}

public class AnnotationController implements Handler {
public void doAnnotationHandler() {
System.out.println("annotation...");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: