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

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

想象一下这样的场景,我需要在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();}}Client {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();}}Client {main(String[] args) {// 使用普通功能类Target concreteTarget = new ConcreteTarget();concreteTarget.request();// 使用特殊功能类,即适配类,// 需要先创建一个被适配类的对象作为参数Target adapter = new Adapter(new Adaptee());adapter.request();}}上面是对象适配器模式。

上面是Adapter模式的常用设计方式,其实Adapter模式并不是硬性规定一定得按照上面的方式设计,java的io包使用了adapter模式,就没有完全遵循上面的设计方式。Adapter模式经常跟Decorator模式一块使用,所以这经常让人很容易混淆。其实要区分这两种设计模式并不难,主要看实现的目的是什么。Adapter模式的目的是避免重复设计相同的功能而巧妙借用已有类的相同功能;而Decorator模式的目的是扩展方法的能力,让一个方法能做附加的事。一般情况下,Adapter模式是一种补偿模式,即用于现有系统的后期扩展。

勇于接受自己的失败,告诉自己,这就是自己的现实,

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

相关文章:

你感兴趣的文章:

标签云: