首页 > 其他分享 >适配器模式

适配器模式

时间:2024-04-06 17:44:51浏览次数:23  
标签:适配器 模式 public class handler new void

 

1. 介绍

  适配器模式将某个类的接口转换成客户端期望的另一个接口,用户调用适配器转换出来的目标接口方法,适配器再调用被适配者的相关接口方法;

 

2. 实现方式

  (1)类适配器模式

/**
 * @Description :被适配类
 * @date :2024/4/6 15:56
 */
public class Voltage220V {

    public Integer output220v(){
        Integer src = 220;
        System.out.println("输出220v");
        return src;
    }
}
/**
 * @Description :适配接口
 * @date :2024/4/6 15:58
 */
public interface IVoltage5V {

    public Integer output5v();
}
/**
 * @Description :适配器类
 * @date :2024/4/6 15:58
 */
public class VoltageAdapter extends Voltage220V implements IVoltage5V {

    @Override
    public Integer output5v() {
        Integer src = output220v();
        System.out.println("正常电压" + src / 44 + "v");
        return src / 44;
    }
}
public class Phone {

    public void charge(IVoltage5V iVoltage5V){
        if (iVoltage5V.output5v() == 5){
            System.out.println("电压可以充电!");
        }else if (iVoltage5V.output5v() > 5){
            System.out.println("电压大于5v");
        }
    }
}
/**
 * @Description :类适配器模式
 * @date :2024/4/6 16:09
 */
public class Client {

    public static void main(String[] args) {
        Phone phone = new Phone();
        phone.charge(new VoltageAdapter());
    }
}

  在示例中通过类适配器模式将输出220v的电压转换成输出5v的电压;

  使用类适配器模式需要继承src类,要求dst类必须是接口,所以有一定的局限性

 

  (2)对象适配器(推荐)

/**
 * @Description :被适配类
 * @date :2024/4/6 15:56
 */
public class Voltage220V {

    public Integer output220v(){
        Integer src = 220;
        System.out.println("输出220v");
        return src;
    }
}
/**
 * @Description :适配接口
 * @date :2024/4/6 15:58
 */
public interface IVoltage5V {

    public Integer output5v();
}
/**
 * @Description :适配器类
 * @date :2024/4/6 15:58
 */
public class VoltageAdapter  implements IVoltage5V {

    private Voltage220V voltage220V;

    public VoltageAdapter(Voltage220V voltage220V) {
        this.voltage220V = voltage220V;
    }

    @Override
    public Integer output5v() {
        int dest = 0;
        if (voltage220V != null){
            Integer src = voltage220V.output220v();
            dest = src / 44;
        }
        return dest;
    }
}
/**
 * @Description :
 * @date :2024/4/6 16:03
 */
public class Phone {

    public void charge(IVoltage5V iVoltage5V){
        if (iVoltage5V.output5v() == 5){
            System.out.println("电压可以充电!");
        }else if (iVoltage5V.output5v() > 5){
            System.out.println("电压大于5v");
        }
    }
}
/**
 * @Description :对象适配器模式
 * @date :2024/4/6 16:09
 */
public class Client {

    public static void main(String[] args) {
        Phone phone = new Phone();
        phone.charge(new VoltageAdapter(new Voltage220V()));
    }
}

  对象适配器使用组合替代继承,解决了类适配器继承src局限性的问题,也不要求dst必须是接口,使用更灵活;

 

  (3)接口适配器

public interface interface4 {

    public void m1();
    public void m2();
    public void m3();
    public void m4();
}
public abstract class AbstractAdapter implements interface4{

    @Override
    public void m1() {

    }

    @Override
    public void m2() {

    }

    @Override
    public void m3() {

    }

    @Override
    public void m4() {

    }
}
/**
 * @Description :接口适配器模式
 * @date :2024/4/6 16:46
 */
public class Client {
    public static void main(String[] args) {
        AbstractAdapter adapter = new AbstractAdapter() {
            @Override
            public void m1() {
                System.out.println("接口适配器模式实现m1()");
            }
        };
        adapter.m1();
    }
}

  接口适配器使用一个抽象类在不需要全部实现接口提供的方法时,为接口中的每一个方法提供一个默认方法,那么抽象类的子类就可以有选择性的覆盖父类中的方法

 

  (4)springmvc中的适配器模式示例

//多种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);
    }

}
import java.util.ArrayList;
import java.util.List;

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) {
        for (HandlerAdapter adapter : this.handlerAdapters) {
            if (adapter.supports(controller)) {
                return adapter;
            }
        }
        return null;
    }

    public static void main(String[] args) {
        new DispatchServlet().doDispatch();
    }

}

 

标签:适配器,模式,public,class,handler,new,void
From: https://www.cnblogs.com/homle/p/18117678

相关文章

  • 观察者模式与发布-订阅模式的对决
    ......
  • Photoshop混合模式的底层原理
        Photoshop虽然不是什么高手,但平时工作中难免会用到,处理部分需求还是可以胜任的。接触PS这么多年,对PS中图层的混合模式(BlendMode)一直就处于懵懂状态,即使是看了教材及视频后,有了一点感性认识,但在实际操作中仍旧无法运用起来。直至某一天,我在B站看到韩世麟的《把PS......
  • 常用软件架构模式优缺点及应用场景
     1、分层架构模式最常见的架构模式就是分层架构或者称为n层架构。大部分软件架构师、设计师和开发者都对这个架构模式非常熟悉。尽管对于层的数量和类型没有具体限制,但大部分分层架构主要由四层组成:展现层、业务层、持久层和数据库层,如下图所示。一个很流行的n层架构示......
  • 建造者模式
     1.盖房子需求(1)建造房子需要打桩,砌墙,封顶;(2)房子有各种各样,如普通房子,高楼。 2.实现方式(1)传统方式/***@Description:传统方式*@date:2024/4/612:11*/publicabstractclassAbstractHouse{//打地基publicabstractvoidbuildBasic()......
  • 将 shell 的行编辑模式设置为Vi 文本编辑器的模式
    set-ovi在Bashshell中,使用set-ovi语句可以将shell的行编辑模式设置为类似于Vi文本编辑器的模式。这意味着当你在命令行中输入命令时,你可以使用Vi或Vim编辑器的按键和命令来编辑和操纵命令行。当设置为Vi模式时,你可以使用以下常用的Vi编辑命令:Esc:进入命......
  • 搭建hadoop 基于yarn的集群模式
     准备工作:三个虚拟机相同操作1.创建三个虚拟机,参考之前的配置信息2.设置主机名vi/etc/hosts 加入192.168.61.112bigdata112192.168.61.113bigdata113192.168.61.114bigdata1143.关闭防火墙:systemctlstopfirewalld.service/systemctldisablefirewalld.servi......
  • ARM上面Docker模式安装chrome以及chromedriver的过程
    ARM上面Docker模式安装chrome以及chromedriver的过程背景公司里面有四台鲲鹏服务器想通过ARM的自动化进行功能遍历走查.前期提过需求,但是同时调研之后发现比较困难,作罢了.最近清明假期.想着能够实现以下.最开始的思路虽然网上有一个chromedriver的下载地址:http......
  • 折腾PXE网络启动 pxe 引导uefi模式 GRUB Shell (TFTPD64 OPENWRT)
    简介:上一篇折腾了maxdos,但是uefi是不支持dos的,openwrt的闪存又决定了只能启动命令行界面的系统,只有UEFIShell适合了。一:所需软件提取BOOTX64.EFIgrub4dos(chenall.net)这次下载grub4dos-for_UEFI下载以后,解压,只需要根目录BOOTX64.EFI文件。配置TFTP文件#创建一个文件夹......
  • B/S架构SaaS模式 医院云HIS系统源码,自主研发,支持电子病历4级
    B/S架构SaaS模式医院云HIS系统源码,自主研发,支持电子病历4级系统概述:一款满足基层医院各类业务需要的云HIS系统。该系统能帮助基层医院完成日常各类业务,提供病患挂号支持、病患问诊、电子病历、开药发药、会员管理、统计查询、医生站和护士站等一系列常规功能,还能与公卫、PAC......
  • 【Java】jdk1.8 Java代理模式,Jdk动态代理讲解(非常详细,附带class文件)
      ......