重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章运用简单易懂的例子给大家介绍Java中适配器模式是什么意思,代码非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
创新互联公司坚持“要么做到,要么别承诺”的工作理念,服务领域包括:网站建设、成都网站制作、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的长清网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!目的:把源类型适配为目标类型,以适应客户端(Client)的需求;此处我们把目标接口的调用方视为客户端
使用场景:需要对类型进行由源类型到目标类型转换的场景中
前置条件:已有客户端
//Client 一个调用目标接口的方法 Class ClientInvoking { static void invoke(TargetInterface target) { String value = target.getMark(); System.out.println(value); } }
常用的几种模式
模式一:存在目标接口,且存在已有方法
//目标接口 public interface TargetInterface { public String getMark(); public String getInfo(); }
//已有类及方法 public class ExistClass { public String sayHello() { return "Hello"; } public String sayWorld() { return "World"; } }
我们假设ExistClass返回的字符串正好是我们的客户端需要用到的,但客户端需要的是通过一个TargetInterface类型的对象来获取,因此我们需要想办法对已有类进行适配,使其能够满足客户端的需求;该模式下存在两种应用方案:
方案1.类适配器模式
//适配器 public class ClassAdapter extends ExistClass implements TargetInterface { public int getMark() { String value = this.sayHello(); return value; } public int getInfo() { String value = this.sayWorld(); return value; } }
//客户端调用 TargetInterface target = new ClassAdapter(); ClientInvoking.invoke(target);
由Java接口的概念可知,ClassAdapter作为TargetInterface的实现类,能够向上转型为TargetInterface类型,适应了客户端的需求。
方案2.对象适配器模式
//适配器 public class ClassAdapter implements TargetInterface { private ExistClass exist; public ClassAdapter(ExistClass existClass) { this.exist = existClass; } public int getMark() { String value = exist.sayHello(); return value; } public int getInfo() { String value = exist.sayWorld(); return value; } }
//客户端调用 TargetInterface target = new ClassAdapter(new ExistClass()); ClientInvoking.invoke(target);
该方案与类适配器模式类似,只是不采用继承而采用持有对象的方式,更加灵活,扩展性更强。
模式二:不存在目标接口,但是存在目标类,且存在已有方法
我们先对前置条件中的客户端进行改造,如下:
Class ClientInvoking { static void invoke(TargetClass target) { String value = target.getMark(); System.out.println(value); } }
改造后,invoke方法需要一个TargetClass类的对象作为参数;下面是目标类和已有类
//目标类 public class Class { public String getMark() { return "yes"; } public String getInfo() { return "no"; } }
//已有类及方法 public class ExistClass { public String sayHello() { return "Hello"; } public String sayWorld() { return "World"; } }
我们假设ExistClass返回的字符串正好是我们的客户端需要用到的,且客户端中需要的TargetClass对象的内容已经过时,因此我们需要相办法对ExistClass进行适配,以适应客户端的需求;
//适配器 public class ClassAdapter extends TargetClass { private ExistClass exist; public ClassAdapter(ExistClass existClass) { this.exist = existClass; } public int getMark() { String value = exist.sayHello(); return value; } public int getInfo() { String value = exist.sayWorld(); return value; } }
//客户端调用 TargetClass target = new ClassAdapter(new ExistClass()); ClientInvoking.invoke(target);
在该种模式下,设计到两个类,且最后要进行向上转型,根据Java的单继承机制,我们只能通过持有对象的形式,即对象适配器模式。
模式三:缺省适配器模式
该模式中,不存在显式的目标类型,而仅有源类型;之所以需要用到这个,往往是因为源类型中提供了太多我们并不需要的东西,我们需要通过适配器模式进行定制化。以WindowListener作为例子讲解:
//WindowListener源码 public interface WindowListener extends EventListener { public void windowOpened(WindowEvent e); public void windowClosing(WindowEvent e); public void windowClosed(WindowEvent e); ... }
//添加监听器的例子 Frame frame = new Frame(); frame.addWindowListener(new WindowListener() { @Override public void windowOpened(WindowEvent e) { } @Override public void windowClosing(WindowEvent e) { } @Override public void windowClosed(WindowEvent e) { } ... })
这样的代码,看起来很繁琐;比如说我只需要监听正在关闭的事件,却生成了许多与此无关的模板代码,降低了代码的可读性,鉴于此,我们来做下定制,只监听一个接口;
我们首先提供一个抽象类实现了该接口,并为所有监听器提供空实现;然后再用抽象类的子类重写窗口正在关闭的监听器的实现,代码如下:
//适配器 public abstract ListenerAdapter implements WindowListener { public void windowOpened(WindowEvent e) {} public void windowClosing(WindowEvent e) {} public void windowClosed(WindowEvent e) {} ... }
//重写方法 public class OverrideWindowClosing extends ListenerAdapter { @Override public void windowClosing(WindowEvent e) { //TODO } }
//客户端调用 frame.addWindowListener(new OverrideWindowClosing());
该方式简化了接口,提高了代码可读性。最重要的是,我们实现了对接口的定制,可以只做自己关心的事情。
关于Java中适配器模式是什么意思就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。