• 设计模式之适配器模式


    对象适配器模式

    1.应用实例说明,以生活中充电器的例子来讲解适配器,充电器本身相当于Adapter,220v交流电相当于src(既适配者)

    我们的目标是5v直流电,使用对象适配器模式完成。

    //适配接口
    public interface IVoltage5V {
        public int output5V();
    }
    //被适配的类
    public class Voltage220V {
        //输出220V的电压,不变
        public int output220V() {
            int src = 220;
            System.out.println("电压=" + src + "");
            return src;
        }
    }
    //适配器类
    public class VoltageAdapter  implements IVoltage5V {
    
        private Voltage220V voltage220V; // 关联关系-聚合
        
        //通过构造器,传入一个 Voltage220V 实例
        public VoltageAdapter(Voltage220V voltage220v) {
    
            this.voltage220V = voltage220v;
        }
    
        @Override
        public int output5V() {
    
            int dst = 0;
            if(null != voltage220V) {
                int src = voltage220V.output220V();//获取220V 电压
                System.out.println("使用对象适配器,进行适配~~");
                dst = src / 44;
                System.out.println("适配完成,输出的电压为=" + dst);
            }
    
            return dst;
    
        }
    
    }
    public class Phone {
    
        //充电
        public void charging(IVoltage5V iVoltage5V) {
            if(iVoltage5V.output5V() == 5) {
                System.out.println("电压为5V, 可以充电~~");
            } else if (iVoltage5V.output5V() > 5) {
                System.out.println("电压大于5V, 不能充电~~");
            }
        }
    }
    public class Client {
        
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            System.out.println(" === 对象适配器模式 ====");
            Phone phone = new Phone();
            phone.charging(new VoltageAdapter(new Voltage220V()));
        }
        
    }

    接口适配器模式

    1.接口适配器又叫缺省适配器模式。

    2.核心思路,当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法),

    那么该抽象类的子类课有选择地覆盖父类的某些方法来实现需求,

    3.适用于一个接口不想使用其所有的方法的情况

    public interface Interface4 {
        public void m1();
        public void m2();
        public void m3();
        public void m4();
    }
    //在AbsAdapter 我们将 Interface4 的方法进行默认实现
    public abstract class AbsAdapter implements Interface4 {
    
        //默认实现
        public void m1() {
    
        }
    
        public void m2() {
    
        }
    
        public void m3() {
    
        }
    
        public void m4() {
    
        }
    }
    public class Client {
        public static void main(String[] args) {
    
            AbsAdapter absAdapter = new AbsAdapter() {
                //只需要去覆盖我们 需要使用 接口方法
                @Override
                public void m1() {
                    // TODO Auto-generated method stub
                    System.out.println("使用了m1的方法");
                }
            };
    
            absAdapter.m1();
        }
        
    }

    模拟SpringMvc的适配器模式

    类图:

    public class DispatchServlet {
    
        public static List<HandlerAdapter> handlerAdapters = new ArrayList<HandlerAdapter>();
    
        public DispatchServlet() {
            handlerAdapters.add(new AnnotationHandlerAdapter());
            handlerAdapters.add(new HttpHandlerAdapter());
            handlerAdapters.add(new SimpleHandlerAdapter());
        }
    
        public void doDispatch() {
    
            // 此处模拟SpringMVC从request取handler的对象,
            // 适配器可以获取到希望的Controller
             HttpController controller = new HttpController();
            // AnnotationController controller = new AnnotationController();
            //SimpleController controller = new SimpleController();
            // 得到对应适配器
            HandlerAdapter adapter = getHandler(controller);
            // 通过适配器执行对应的controller对应方法
            adapter.handle(controller);
    
        }
    
        public HandlerAdapter getHandler(Controller controller) {
            //遍历:根据得到的controller(handler), 返回对应适配器
            for (HandlerAdapter adapter : this.handlerAdapters) {
                if (adapter.supports(controller)) {
                    return adapter;
                }
            }
            return null;
        }
    
        public static void main(String[] args) {
            new DispatchServlet().doDispatch(); // http...
        }
    
    }
    //多种Controller实现  
    public interface Controller {
    
    }
    
    class HttpController implements Controller {
        public void doHttpHandler() {
            System.out.println("http...");
        }
    }
    
    class SimpleController implements Controller {
        public void doSimplerHandler() {
            System.out.println("simple...");
        }
    }
    
    class AnnotationController implements Controller {
        public void doAnnotationHandler() {
            System.out.println("annotation...");
        }
    }
    //定义一个Adapter接口 
    public interface HandlerAdapter {
        public boolean supports(Object handler);
    
        public void handle(Object handler);
    }
    
    // 多种适配器类
    
    class SimpleHandlerAdapter implements HandlerAdapter {
    
        public void handle(Object handler) {
            ((SimpleController) handler).doSimplerHandler();
        }
    
        public boolean supports(Object handler) {
            return (handler instanceof SimpleController);
        }
    
    }
    
    class HttpHandlerAdapter implements HandlerAdapter {
    
        public void handle(Object handler) {
            ((HttpController) handler).doHttpHandler();
        }
    
        public boolean supports(Object handler) {
            return (handler instanceof HttpController);
        }
    
    }
    
    class AnnotationHandlerAdapter implements HandlerAdapter {
    
        public void handle(Object handler) {
            ((AnnotationController) handler).doAnnotationHandler();
        }
    
        public boolean supports(Object handler) {
    
            return (handler instanceof AnnotationController);
        }
    
    }

    适配器模式总结:

    1.类适配器:以类给到,在Adapter里,就是将src当做类,继承

    2.对象适配器:以对象给到,在Adapter里,将src作为一个对象持有接口适配器,以接口给到,在Adapter里,将src作为一个接口实现

    3.Adapter模式最大的作用还是将原本不兼容的接口融合在一起工作。

    摘自 韩顺平大神笔记

  • 相关阅读:
    云南网页首页布局全代码
    表格样式(鼠标经过时整行变色)
    做自定义圆角矩形
    网页布局
    黄冈中学首页的模板简图
    动态网页简版
    十字绣首页设计
    go组合
    http rpc关联
    php echo print
  • 原文地址:https://www.cnblogs.com/liuyi13535496566/p/13246153.html
Copyright © 2020-2023  润新知