精华内容
下载资源
问答
  • 对象适配器模式与类适配器模式相同,知识将Adapter类修改了,不再是继承src类,而是持有src类的实例,以解决兼容性问题。即持有src类,实现dst接口,完成src——>dst的适配 根据“合成复用原则”,在系统中尽量...

    对象适配器模式与类适配器模式相同,知识将Adapter类修改了,不再是继承src类,而是持有src类的实例,以解决兼容性问题。即持有src类,实现dst接口,完成src——>dst的适配

    根据“合成复用原则”,在系统中尽量使用关联关系来替代继承关系。
    以生活充电器例子来讲解适配器,充电器本身相当于Adapter。220V相当于src(被适配者),我们的目标是dst(目标)是5v直流电,使用对象适配器模式完成

    类图:
    在这里插入图片描述

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

    对象适配器模式:和类适配器模式同一种思想,只不过实现方式不同。根据合成复用原则,使用组合代替了继承,所以它解决了类适配器必须继承src的局限性问题,也不再要求dst必须是接口

    展开全文
  • 一、对象适配器模式介绍 基本思路和类的适配器模式相同,只是将Adapter类作修改,不是继承src类,而是持有src类的实例,以解决兼容性的问题。 即:持有 src类,实现 dst 类接口,完成src->dst的适配。 根据...

    一、对象适配器模式介绍

    1. 基本思路和类的适配器模式相同,只是将Adapter类作修改,不是继承src类,而是持有src类的实例,以解决兼容性的问题。 即:持有 src类,实现 dst 类接口,完成src->dst的适配。
    2. 根据“合成复用原则”,在系统中尽量使用关联关系来替代继承关系。
    3. 对象适配器模式是适配器模式常用的一种。

    二、使用对象适配器完成上一篇文章的问题

    代码:

    //被适配的类
    public class Voltage220V {
    	//输出220V的电压
    	public int output220V() {
    		int src = 220;
    		System.out.println("电压=" + src + "伏");
    		return src;
    	}
    }
    
    //适配接口
    public interface IVoltage5V {
    	public int output5V();
    }
    
    //适配器类
    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) {
    		System.out.println(" === 类适配器模式 ====");
    		Phone phone = new Phone();
    		phone.charging(new VoltageAdapter(new Voltage220V()));
    	}
    }
    

    结果图:

    在这里插入图片描述

    三、对象适配器模式注意事项和细节

    1. 对象适配器和类适配器其实算是同一种思想,只不过实现方式不同。根据合成复用原则,使用组合替代继承, 所以它解决了类适配器必须继承src的局限性问题,也不再要求dst必须是接口。
    2. 使用成本更低,更灵活。
    展开全文
  • 适配器模式的定义: 将一个类的接口变成客户端所期待的另一种接口,从而使原本因接口不匹配而无法工作的两个类能够在一起工作;...对象适配器:通过关联关系完成适配:[从在多个被适配者] 通过依赖注入,注入多...

    适配器模式的定义: 将一个类的接口变成客户端所期待的另一种接口,从而使原本因接口不匹配而无法工作的两个类能够在一起工作;

    适配器模式的UML图如下,适配器需要将Adaptee被适配者与target结合,从而使得客户端能够完成对不兼容对象adaptee的兼容调用

    类适配器: 通过继承完成适配[存在一个被适配者]

    对象适配器:通过关联关系完成适配:[从在多个被适配者]

    通过依赖注入,注入多个被适配实现者

    以下为自己对适配器模式产生的场景的总结:
    在最开始的上下文中,我们定义了一系列的业务设计;并且满足了现有的业务设计,但需求变化无法预估,后来产生了一种新的场景,需要对接新的业务,而这部分业务不兼容现有的接口设计,通过新建适配器,将这部分业务的数据转换成现有的业务数据;
    这就是适配器产生的根本原因,被适配者已经存在且无法兼容,如果新的需求未实现,那么完全可以采用扩展性的设计去实现,而不是通过适配器去实现

     

     

    优点:

    1 增加访问透明性,我们只需要访问目标角色金额适配者,而不需要访问被适配者

    2 通过适配器做到可插拔,同时不影响现有结构保持开闭原则

    缺点: 该模式实际适合多系统的交互,一个全新的设计系统不应该考虑使用该模式,适配的目的是做兼容

     

    使用场景: 适配器模式是一种补救模式,但凡多个不兼容的系统需要兼容的时候就可以通过适配器模式去做补救

    展开全文
  • 适配器模式

    2020-05-05 10:33:59
    文章目录适配器模式前言结构型设计模式适配器的定义适配器模式的结构适配器模式-类适配器案例适配器模式-对象适配器案例适配器模式-案例-仿生机器人模式应用适配器模式的总结优点缺点适用环境适配器的扩展默认适配器...

    适配器模式

    前言

    适配器模式是一种使用频率非常高的结构型设计模式。

    结构型设计模式:根据类的“单一职责原则”,一个软件系统中每一类都应该担负一定的职责,能够完成一定的业务功能,但单个类的作用是有限的,系统中很多任务的完成需要多个类相互协作,因此需要将这些类或者类的实例进行组合。

    结构型设计模式

    结构型模式描述如何将类或者对象结合在一起形成更大的结构。

    结构型模式可以描述两种不同的东西:类与类的实例(即对象)。根据这一点,结构型模式可以分为类结构型模式和对象结构型模式。

    • 类结构型模式关心类的组合,由多个类可以组合成一个更大的系统,在类结构型模式中一般只存在继承关系和实现关系;
    • 对象结构型模式关心类与对象的组合,通过关联关系使得在一个类中定义另一个类的实例对象,然后通过该对象调用其方法,根据“合成复用原则”,在系统中应当尽量使用关联关系来代替继承关系,因此大部分结构型模式都是对象结构型模式

    适配器的定义

    在现实生活中,经常存在一些不兼容。如某电器的工作电压与家庭交流电电压不一致,网络速度与计算机处理速度不一致、某硬件设备提供的接口与计算机支持的接口不一致等。

    这种情况下,我们可以通过一个新的设备使原本不兼容的事物可以一起工作,这个新的设备称为适配器。软件中为了解决这种问题就引入了适配器的概念。

    将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wapper)。适配器模式既可以作为类结构型模式。

    适配器模式的结构

    1. Target 目标抽象类:目标抽像类定义客户要用的特定领域的接口,可以是个抽象类或接口,也可以是具体类;在类适配器中,由于Java语句不支持多重继承,它只能是接口。(在Java 8 中,可以用默认方法去设计一个适配器)
    2. Adapter 适配器类:适配器类可以调用另一个接口,作为一个转换器,对Adapter 和 Target 进行适配。适配器类是适配器模式的核心,它通过实现 Target 接口并继承 Adaptee 类来使二者产生联系,在对象适配器中,它通过继承 Target 并关联一个 Adaptee 的对象使二者产生联系。
    3. Adaptee 适配者类:适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体的类,包含了客户希望使用的业务方法,在某些情况下甚至没有适配者的源代码。
    4. Client 客户类:在客户类中针对目标抽象类进行编程,调用在目标抽象类中定义的业务方法。

    适配器模式-类适配器案例

    在这里插入图片描述

    Java 代码实现见:org.feng.pattern.adapter1 包。

    适配器模式-对象适配器案例

    其差别在于,Adapter 并不需要继承 Adaptee 了,只需要使用构造器注入 Adaptee 对象,然后在 request 方法中使用该对象调用 specificRequest 方法即可。Java 代码实现见:org.feng.pattern.adapter2包。

    适配器模式-案例-仿生机器人

    设计一个可以模拟各种动物行为的机器人,在机器人中定义了一系列方法,如 cry 喊叫,move移动等。如果希望在不修改已有代码的基础上使得机器人能够像狗一样叫,像狗一样跑,可以使用适配器模式进行系统设计。

    在这里插入图片描述

    Java 代码的实现见:org.feng.pattern.robot包。

    这样的设计,在扩展方面,可以满足开闭原则。不用修改原来的代码,只需要增加类即可。根据里氏代换原则,具体的类可以代替其父类或接口出现在某个位置。这也是Java 中多态的一种体现。

    比如现在需要增加一个鸟和鸟的适配器。

    在这里插入图片描述

    然后只需要在配置文件中修改类名标签的内容为 BirdAdapter即可。

    模式应用

    在 Java 的 JDBC 中,不同的JDBC 接口,对应在不同的数据库有不同的连接。

    适配器模式的总结

    优点

    1. 将目标类和适配类解耦,通过引入一个适配类来重用现有的适配者类,而无须修改现有代码。
    2. 增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性。
    3. 灵活性和扩展性都非常好,通过使用配置文件,可以很方便的更换适配器,也可以在不修改原有代码的基础上增加新的适配器类,完全符合“开闭原则”。
    4. 搭配上里氏代换原则,适配器的扩展性和灵活性更加能体现出来。另外,其属于方法层面的组装,在适配器类中可以自由增加自己需要的东西。

    缺点

    • 对于 Java 、C#等不支持多继承的语言,一次最多只能适配一个适配者类,而且目标抽象类只能为接口,不能为类,其使用有一定的局限性。

    • 实现步骤繁多。

    适用环境

    • 系统需要使用现有类,而这些类的接口不符合系统的需要。
    • 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。

    适配器的扩展

    默认适配器

    在这里插入图片描述

    默认适配器是适配器的一种变形,但是其使用也非常广泛。

    当不需要全部实现接口提供的方法时,可先设计一个抽象类实现该接口,并为接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可有选择地覆盖父类的某些方法类实现需求。

    它适用于一个接口不想适用其所有的方法的情况。

    关于默认适配器,可以使用Java 8 中的接口的默认方法来进行优化,可以减少中间这个适配类。将接口中的方法定义为默认方法即可(在实现的过程中,什么都不写,或者抛出不支持的操作异常)

    双向适配器

    在对象适配器的使用过程中,如果在适配器中同时包含对目标类和适配者类的引用,适配者可以通过它调用目标类中的方法,目标类也可以通过适配者类中的方法。

    附录

    项目地址:https://github.com/fengsoshuai/Design-Pattern
    中的 adapter

    展开全文
  • 适配器模式1.1 定义适配器模式1.2 对象和类适配器的类图1.3 实现对象适配器1.4 真实世界的适配器2. 外观模式2.1 定义外观模式2.2 类图2.3 实现3. 最少知识原则 随遇而安 文章说明 该文章为《Head First 设计模式...
  • 适配器模式(Adapter Pattern)定义适配器模式,将一个接口转换客户希望的另一个接口。适配器将原本不能在一起工作的接口转换成可以在一起...适配器出现的目的是为了保证不违反面向对象编程的开放封闭原则UML 示例@s...
  • 理解适配器模式

    2015-05-04 09:49:00
    类适配器模式和对象适配器模式最大的区别在于:对象适配器模式中适配器和适配者之间是关联关系,而类适配器模式中适配器和适配者是继承关系 一、对象设配器模式  关键点:适配器需要继承目标类,这样才符合里氏...
  • 适配器模式又叫做变压器模式,它的功能是将一个类的接口变成客户端所期望的另一个接口,从而使原本接口不匹配而导致无法在一起工作的两个类能够一起工作。...对象适配器 通过构造方法传入原角色符合最小知道原则 接口适
  • 适配器模式适配器模式的应用场景类适配器对象适配器接口适配器适配器模式在源码中的体现适配器模式和装饰器模式对比适配器模式的优缺点 适配器模式 ( Adapter Pattern )又叫做变压器模式,它的功能是将一个类的接口...
  • 设计模式 - D7 - 适配器模式与外观模式面向对象适配器示例适配器模式定义对象适配器 vs 类适配器装饰者模式 vs 适配器模式外观模式最少知道原则 面向对象适配器 假设已有一个软件系统,当我们希望他能与一个新的厂商...
  • 对象适配器模式 接口适配器模式(缺省适配器模式) Git地址 导航 设计模式之六大设计原则 设计模式(一)单例模式 设计模式(二)工厂模式 设计模式(三)策略模式 设计模式(四)适配器模式 设...
  • 目录 结构型模式 适配器模式概述 适配器模式的结构与实现 ...不同的结构型模式从不同的角度组合类或对象,它们在尽可能满足各种面向对象设计原则的同时为类或对象的组合提供一系列巧妙的解决方案 ...
  • 适配器模式、代理模式和装饰者模式是设计模式中的高频设计模式,三者非常相似,需要重点区分下。直接上结论先,装饰者模式的关注点在于添加功能。代理模式的关注点在于控制对象的访问,其原型对象对于用户无法得知。...
  • 大纲结构型模式概述适配器模式概述适配器模式的结构与实现适配器模式的应用实例缺省适配器模式适配器模式的优缺点与适用环境结构型模式概述结构型模式(Structural Pattern)关注如何将现有类或对象组织在一起形成更加...
  • Python设计模式:适配器模式

    万次阅读 2019-12-29 15:11:42
    设计模式五:适配器模式 什么是适配器模式 实现两个不兼容接口之间的兼容 使用场景 某个产品已制造出来之后,需要应对新的需求,希望其仍然有效 不兼容接口是他方的或者是老旧的,无法访问其源码或者修改起来不切...
  • 适配器模式 将一个类的接口转换成客户希望的另外一个接口。 角色分析 目标接口:客户所期待的接口,目标可以是具体的或抽象的类,也可以是接口 需要适配的类:需要适配的类或适配者类 适配器:通过包装一个需要适配...
  • 适配器模式是一种结构型设计模式,它能使接口不兼容的对象能够相互合作。 2、结构图 对象适配器 实现时使用了构成原则:适配器实现了其中一个对象的接口,并对另一个对象进行封装。所有流行的编程语言都可以实现...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 390
精华内容 156
关键字:

原则对象适配器模式