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

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

想象一下这样的场景,我需要在A类中实现a功能,而B类已经有a功能了。当然,我可以直接从B类中将a代码拷贝到A类中来。直接在A类中使用B类的a功能不是更好吗?那如何组织这两个类会比较优雅呢?当我这样想的时候,adapter模式就来了。

适配器(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();
	}
}
上面是对象适配器模式,符合java提倡的编程思想“多使用内聚,少使用继承”。

上面是Adapter模式的常用设计方式。Adapter模式跟Decorator模式很容易混淆。其实要区分这两种设计模式并不难,Adapter模式的目的是避免重复设计相同的功能,巧妙地将抽象与已有类结合,适配和被适配所使用的接口不同;而Decorator模式的目的是扩展方法的能力,让一个方法能做附加的事,装饰和被装饰所使用的接口相同。通常情况下,Adapter模式是一种补偿模式,即用于现有系统的后期扩展。

参考资料:http://blog.sina.com.cn/s/blog_563742da0100crnl.html


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值