设计模式学习之适配器模式

学习完了创建型设计模式,接下来准备学习结构型设计模式。我的个人理解是,创建型设计模式是如何优雅的生成新的对象,而结构型设计模式是如何优雅的组织对象。针对不同的应用场景,组织对象的方式也可能不尽相同。换言之,先得有场景,才需要选择设计模式。这是理解结构型设计模式最重要的地方。曾经有人问我,这么多设计模式根本记不住,而且有些模式感觉差不多,容易混淆。诚然,死记硬背各种模式,很难灵活运用,千万不能拘泥于模式。

想象一下这样的场景,需要根据不同的配置文件,选择不同jar包中的某个类进行处理。问题来了,如何组织这两个类比较优雅呢?当然,我们可以根据if else进行复杂的处理。但是,如果未来需要扩展另一个jar包的类呢,为啥我们不抽象出一个接口,当中间层来进行适配呢?这样不是更容易扩展、更优雅吗?当我这样想的时候,adapter模式就来了。

适配器(Adapter)模式又可以细分为类适配器模式和对象适配器模式。我觉得当我在这样的场景,想到抽象出一个接口时,如何区分类适配和对象适配真的没那么重要了。下面是网上摘录的例子,一看便明白了:

// 已存在的、具有特殊功能、但不符合我们既有的标准接口的类
class Adaptee {
	public void specificRequest() {
		System.out.println("被适配类具有 特殊功能...");
	}
}
// 目标接口,或称为标准接口
interface Target {
	public void request();
}

// 具体目标类,只提供普通功能
class ConcreteTarget implements Target {
	public void request() {
		System.out.println("普通类 具有 普通功能...");
	}
}
// 适配器类,继承了被适配类,同时实现标准接口
class Adapter extends Adaptee implements Target{
	public void request() {
		super.specificRequest();
	}
}
// 测试类
public class Client {
	public static void main(String[] args) {
		// 使用普通功能类
		Target concreteTarget = new ConcreteTarget();
		concreteTarget.request();

		// 使用特殊功能类,即适配类
		Target adapter = new Adapter();
		adapter.request();
	}
}

上面是类适配器模式。

// 适配器类,直接关联被适配类,同时实现标准接口
class Adapter implements Target{
	// 直接关联被适配类
	private Adaptee adaptee;

	// 可以通过构造函数传入具体需要适配的被适配类对象
	public Adapter (Adaptee adaptee) {
		this.adaptee = adaptee;
	}

	public void request() {
		// 这里是使用委托的方式完成特殊功能
		this.adaptee.specificRequest();
	}
}
/ 测试类
public class Client {
	public static void main(String[] args) {
		// 使用普通功能类
		Target concreteTarget = new ConcreteTarget();
		concreteTarget.request();

		// 使用特殊功能类,即适配类,
		// 需要先创建一个被适配类的对象作为参数
		Target adapter = new Adapter(new Adaptee());
		adapter.request();
	}
}

上面是对象适配器模式。

Adapter模式稍做变动就可以变成Decorator模式。这经常让人很容易混淆。其实要区分这两种设计模式并不难,主要看实现的目的是什么。Adapter模式的目的是设计统一的接口,适配多种不同的情况;而Decorator模式的目的是扩展方法的能力,让一个方法能做附加的事。

时间: 2024-10-13 18:00:38

设计模式学习之适配器模式的相关文章

设计模式学习笔记-适配器模式(对象适配器)

一.概述 将一个类的接口转换为客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作: 二.模式中的角色 Target:定义客户端使用的与特定领域相关的接口: Clinet:与符合Target接口的对象协同: Adpatee:定义一个已经存在的接口,这个接口需要适配: Adpater:对Adpatee的接口与Target接口进行匹配: 三.UML类图 四.代码实现 /// <summary> /// 客户端期待的类 /// </summary&

设计模式学习笔记——适配器模式

1.特点:让接口不相容的类能协同工作.(亡羊补牢) 2.概念:适配器模式,将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 3.类图: 4.程序实现: /// <summary> /// 定义客户端期待的接口 /// </summary> public class Target { /// <summary> /// 使用virtual修饰以便子类可以重写 /// </summary>

设计模式学习笔记--适配器模式

1 using System; 2 3 namespace Adapter 4 { 5 /// <summary> 6 /// 作者:bzyzhang 7 /// 时间:2016/5/28 20:47:51 8 /// 博客地址:http://www.cnblogs.com/bzyzhang/ 9 /// Target说明:本代码版权归bzyzhang所有,使用时必须带上bzyzhang博客地址 10 /// </summary> 11 public class Target 12

设计模式学习目录

java版设计模式学习目录 适配器模式 建造者模式 版权声明:本文为博主原创文章,未经博主允许不得转载.

《Head First 设计模式》学习笔记——适配器模式 + 外观模式

在ADO.NET中,对于我们从数据库中取出的数据都要放到一个DataSet中,不管你是Access的数据库,还是SQL的数据库,或者是Oracle的数据库都要放到DataSet中..NET中并没有提供如:SqlDataSet.OleDbDataSet.OracleDataSet等,它只提供了一种DataSet就是用SqlDataAdapte等去填充数据:为什么这一个DataSet能存放不同的数据呢?就是有这些适配器来适配.----题记 设计模式 适配器模式:将一个类的接口,转换成客户期待的另一个

java/android 设计模式学习笔记(6)---适配器模式

这篇来介绍一下适配器模式(Adapter Pattern),适配器模式在开发中使用的频率也是很高的,像 ListView 和 RecyclerView 的 Adapter 等都是使用的适配器模式.在我们的实际生活中也有很多类似于适配器的例子,比如香港的插座和大陆的插座就是两种格式的,为了能够成功适配,一般会在中间加上一个电源适配器,形如: 这样就能够将原来不符合的现有系统和目标系统通过适配器成功连接. 说到底,适配器模式是将原来不兼容的两个类融合在一起,它有点类似于粘合剂,将不同的东西通过一种转

设计模式学习笔记之适配器模式

什么是适配器模式? 适配器模式(有时候也称包装样式或者包装)就是将一个类的接口适配成用户所期待的.一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中. 看一个我们日常生活中的图: 如果出国旅行,肯定会买一些国外的优质的电器回来,但是国外的电器插头可能是这样的.. 而国内的插座确实这样的.. 肯定是插不进去的..怎么办呢?神通广大的适配器就该出场了! 这下应该可以理解适配器是用来干嘛的了吧,其实设计模式中的适配器模式和这个道理是一样的. 我们来

设计模式学习总结

本文是对各处设计模式示例的总结概括和简化,主要参考 http://blog.csdn.net/zhangerqing/article/details/8194653 直接看本文估计比较枯燥无聊,因为没图~~??,建议对设计模式有兴趣的先看看上面的博文,或者基础比较好可直接移到最底下看下我的各模式一句话概括总结,有什么意见建议欢迎提出~~~~~~~~~~ 总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式.结构型模式,共七种:适配器模式.装饰

java/android 设计模式学习笔记(14)---外观模式

这篇博客来介绍外观模式(Facade Pattern),外观模式也称为门面模式,它在开发过程中运用频率非常高,尤其是第三方 SDK 基本很大概率都会使用外观模式.通过一个外观类使得整个子系统只有一个统一的高层的接口,这样能够降低用户的使用成本,也对用户屏蔽了很多实现细节.当然,在我们的开发过程中,外观模式也是我们封装 API 的常用手段,例如网络模块.ImageLoader 模块等.其实我们在开发过程中可能已经使用过很多次外观模式,只是没有从理论层面去了解它. 转载请注明出处:http://bl