设计模式——适配器模式
来源:互联网 发布:java系统日志记录 编辑:程序博客网 时间:2024/06/07 15:29
@Author:云都小生
概述
“适配器”在我们生活中很常见,像有些电器的工作电压是20V,但是家庭电压是220V,产生了不兼容的问题。但是由于有适配器这种东西,就能解决这个不兼容的问题。
在软件开发领域,我们也会碰到这样的问题,两个对象/类之间不兼容,可以引入一个“适配器”来协调这些不兼容的结构。适配器模式是一个结构型设计模式。
将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。
对象适配器
在对象适配器模式中,适配器与适配者之间是关联关系。
在对象适配器模式中通常有以下角色:目标抽象类、适配器类和适配器者类。
目标抽象类:这个定义的是提供给用户使用的接口;
适配器类:适配器类就是一个转换器,将不兼容的接口转化成一个兼容的接口,这个类是适配器模式的核心;
适配者类:被适配的对象,也就是用户想要使用的方法。
对象适配器用得比较频繁,因为很多类被封装后,没有源代码了,所以在没有办法修改源代码的情况下,我们就需要使用对象适配器。
实例代码
//适配者类public class Jack220V { public void connection() { System.out.println("你已经连接了一个220V的插口"); }}//面向用户的插口(用户期盼看到的)public class JackUser { public void connection() { System.out.println("你已经连接了一个220V的插口"); } }//适配器类class Adapter extends JackUser { private Jack220V jack220v = new Jack220V(); //维持一个对适配者对象的引用 public void connection() { System.out.println("你通过适配器连接了一个220V的插头"); jack220v.connection(); //转发调用 } } //客户端类public class Client { public static void main(String[] args) { JackUser jack = new Adapter(); jack.connection(); }}
我们向用户提供了一个插口,这个插口可以连接220V的电路,但是我们是通过适配器来进行转化的。
类适配器
在现实案例中,类适配器会比较少用。对象适配器用得频繁,类适配器的使用受到很多限制。
对象适配器模式中适配器和适配者之间是关联关系,而类适配器模式中适配器和适配者是继承关系。
interface Target { public void request();}public class Adaptee { public void specificRequest() { System.out.println("我是一个普通的适配器类"); }}class Adapter extends Adaptee implements Target { public void request() { super.specificRequest(); } } public class Client { public static void main(String[] args) { Target adapter = new Adapter(); adapter.request(); }}
再说一次!对象适配器模式中适配器和适配者之间是关联关系,而类适配器模式中适配器和适配者是继承关系。
缺省适配器模式
现在有这么一种情况,我们需要实现一个接口,但是不需要实现一个接口里的所有方法,我们应该怎么做?
可以选择这样,我们先用一个抽象类实现该接口。这样一来,我们的适配器可以直接继承这个适配器类。接口的方法必须全部覆盖,但是由于有抽象类把这些方法定义成了空方法,我们只需要选择性的覆盖即可。
在缺省适配器模式中,通常包含如下三个角色:适配者接口、缺省适配器类、具体业务类。
适配者接口声明了大量的方法。
缺省适配器类是缺省适配器模式的核心,实现适配者接口,它通常是抽象的,可以使用空方法来定义适配者类的方法。
具体业务类是缺省适配器的子类,直接继承适配器类,可以有选择地对适配器类中定义的方法进行覆盖。
优缺点
优点:由于有了适配器,我们不用去修改原有的结构,就像有了一个适配器,我们就不用调整电压啦。
可扩展性也很强,在不修改源代码的基础上,我们又能增加一些新的适配器类。
缺点:有一些编程语言不支持多重继承,不能同时适配多个适配者。其次,有些情况下,适配者模式的实现过程会比较麻烦、复杂一些。
2017/10/25 22:41:05 @Author:云都小生
- 设计模式—适配器模式
- 设计模式—适配器模式
- 设计模式—适配器模式
- 设计模式—适配器模式
- 设计模式—适配器模式
- 设计模式—适配器模式
- 设计模式—适配器模式
- 设计模式—适配器模式
- 设计模式——适配器
- 每日设计模式——适配器模式
- 浅谈设计模式——适配器模式
- 设计模式——适配器模式(Adapter)
- 设计模式—适配器模式—C++
- JAVA设计模式——适配器模式
- java设计模式——适配器模式
- 【大话设计模式】——适配器模式
- JAVA设计模式——适配器模式
- 设计模式——适配器模式
- Kth Smallest Number in Multiplication Table
- 30. Substring with Concatenation of All Words
- 单例模式
- PyCharm20171025测试激活码可用http://xidea.online
- 1025-hadoop课程
- 设计模式——适配器模式
- LeetCode52. N-Queens II
- sudo xxxx is not in the sudoers file
- 强化学习(一)~(五)
- Linux的总线、设备、驱动模型
- 264. Ugly Number II
- SSH与SSM学习之Spring12——动态代理之实现
- Linux:FHS标准
- cocos-2d 游戏开发