导读:适配器模式.基本介绍.1.适配器模式(Adapter Pattern)将某个类的接口(方法)转换成客户期望的另一个接口(方法)表示,主要目的是兼容性,让原本因为方法不匹配的,不能一起工作的两个类可以协同工作。别名叫包装器(Wrapper)。.2.适配器模式属于结构模式。.3.主要
Adapter类,通过继承src类,实现dest接口,完成src -> dest的适配。
案例只是展示这种思想,无实际意义。
public class Voltage220V {
public int output220V(){
int voltage = 220;
System.out.println("电压" + voltage + "V");
return voltage;
}
}
public interface Voltage5V {
public int output5V();
}
public class Adapter extends Voltage220V implements Voltage5V{
@Override
public int output5V() {
int src = this.output220V();
int dest = src / 44;//转成5v
return dest;
}
}
public class Phone {
public void charging(Voltage5V v){
if(v.output5V() == 5){
System.out.println("电压为5V,可以充电");
}else if(v.output5V() > 5){
System.out.println("电压大于5V,不能充电");
}
}
}
//测试
public class Client {
public static void main(String[] args) {
System.out.println("类适配器模式");
new Phone().charging(new Adapter());
}
}
用对象适配器模式,完成手机充电案例
public class Voltage220V {
public int output220V(){
int voltage = 220;
System.out.println("输出电压" + voltage + "V");
return voltage;
}
}
public interface Voltage5V {
public int output5V();
}
public class Phone {
public void charging(Voltage5V v){
if(v.output5V() == 5){
System.out.println("电压为5V,可以充电");
}else if(v.output5V() > 5){
System.out.println("电压大于5V,不能充电");
}
}
}
public class Adapter implements Voltage5V {
private Voltage220V voltage220V;
public Adapter(){}
public Adapter(Voltage220V voltage220V){
this.voltage220V = voltage220V;
}
public void setVoltage220V(Voltage220V voltage220V) {
this.voltage220V = voltage220V;
}
@Override
public int output5V() {
int src = voltage220V.output220V();
int dest = src / 44;
System.out.println("进行电压适配" + src + "->" + dest);
return dest;
}
}
public class Client {
public static void main(String[] args) {
System.out.println("对象适配器模式");
Phone phone = new Phone();
Adapter adapter = new Adapter(new Voltage220V());
phone.charging(adapter);
}
}
1.Android中的属性动画ValueAnimator类可以通过addListener(AnimatorListener listener)方法添加监听器,常规方法如下右图。
2.不想实现Animator.AnimatorListener接口的全部方法,我们只想监听onAnimationStart 如下 下图写。
3.AnimatorListenerAdapter类,就是一个接口适配器,代码如下 右图。
4.AnimatorListener是一个接口。
5.程序里的匿名内部类就是AnimatorListener的具体实现类。
Java中的匿名内部类,类似接口适配器模式。
1.SpringMVC中的HandlerAdapter,就是用了适配器模式。
2.使用HandlerAdapter的原因分析。Handler(controller,处理器)的类型不同,有多重实现方式,那么调用方式就不是确定的,如果需要直接调用Controller方法,需要调用时,就要使用很多的if else分支语句,进行判断,哪一种子类执行。这样的写法,如果要扩展controller,就要修改原来的代码,违背了ocp。
3.代码分析
//DispatchServlet类中得doDispatch(HttpServletRequest request, HttpServletResponse response)方法 部分源码 HttpServletRequest processedRequest = request; HandlerExecutionChain mappedHandler = null;//参数定义 // Determine handler for the current request. mappedHandler = getHandler(processedRequest);//根据请求获取 对应的HandlerExecutionChain if (mappedHandler == null) { noHandlerFound(processedRequest, response); return; }
// Determine handler adapter for the current request. HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());//根据handler获取对应的HandlerAdapter
//getHandlerAdapter源码 遍历所有的HandlerAdapter 判断是否支持当前handler,支持返回对应的HandlerAdapter protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException { if (this.handlerAdapters != null) { for (HandlerAdapter ha : this.handlerAdapters) { if (logger.isTraceEnabled()) { logger.trace(“Testing handler adapter [” + ha + “]”); } if (ha.supports(handler)) { return ha; } } } throw new ServletException(“No adapter for handler [” + handler + “]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler”); }
4.HandlerAdapter接口中的方法
boolean supports(Object handler);//判断是否支持当前handler //执行handler @Nullable ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; long getLastModified(HttpServletRequest request, Object handler);
5.HandlerAdapter及其子类
6.简单模拟写一下适配器模式,及其对应的controller源码
/**
}
class HttpController implements Controller{ public void doHttpController(){ System.out.println(“http…”); } }
class SimpleController implements Controller{ public void doSimpleController(){ System.out.println(“simple…”); } }
class AnnotationController implements Controller{ public void doAnnotationController(){ System.out.println(“annotation…”); } } /** * @author 长名06 * @version 1.0 * 适配器接口 * 一个controller对应一个handlerAdapter */ public interface HandlerAdapter {
//判断handler是否是当前适配器对应的controller
boolean supports(Object handler);
void handle(Object handler);
}
class HttpHandlerAdapter implements HandlerAdapter{ @Override public boolean supports(Object handler) { return (handler instanceof HttpController); }
@Override
public void handle(Object handler) {
((HttpController) handler).doHttpController();
}
}
class SimpleHandlerAdapter implements HandlerAdapter{ @Override public boolean supports(Object handler) { return (handler instanceof SimpleController); }
@Override
public void handle(Object handler) {
((SimpleController) handler).doSimpleController();
}
}
class AnnotationHandlerAdapter implements HandlerAdapter{ @Override public boolean supports(Object handler) { return (handler instanceof AnnotationController); }
@Override
public void handle(Object handler) {
((AnnotationController) handler).doAnnotationController();
}
} /** * @author 长名06 * @version 1.0 * 适配器模式 */ public class Dispatch {
public static final List<HandlerAdapter> handlerAdapters = new ArrayList<HandlerAdapter>();
public Dispatch(){
handlerAdapters.add(new HttpHandlerAdapter());
handlerAdapters.add(new AnnotationHandlerAdapter());
handlerAdapters.add(new SimpleHandlerAdapter());
}
public void doDispatch(){
// HttpController controller = new HttpController(); // SimpleController controller = new SimpleController(); AnnotationController controller = new AnnotationController(); HandlerAdapter adapter = getHandler(controller); adapter.handle(controller); }
public HandlerAdapter getHandler(Controller controller){
for(HandlerAdapter ha : this.handlerAdapters){
if(ha.supports(controller)){
return ha;
}
}
return null;
}
public static void main(String[] args) {
new Dispatch().doDispatch();
}
}
只是为了记录自己的学习历程,且本人水平有限,不对之处,请指正。
上一篇:《Mastering the F
下一篇:产品经理商业思维能力如何提升