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