java设计模式——Adapter模式

来源:互联网 发布:eagle软件官网 编辑:程序博客网 时间:2024/06/05 07:11

1.概述:
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。

3.模式中的角色

  3.1 目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。

  3.2 需要适配的类(Adaptee):需要适配的类或适配者类。

  3.3 适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。  

4.实现方式:
  1.类适配器
  2.对象适配器

一、类适配器

// 已存在的、具有特殊功能、但不符合我们既有的标准接口的类  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();      }  }  

由于类适配器需要继承一个类,而java中一个类只能继承一个类,使用了类适配器之后灵活性就降低了,这样就不好,所以就有了对象适配器。

二、对象适配器

// 适配器类,直接关联被适配类,同时实现标准接口  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();      }  }  

这种方式和第一种的结果是一样的,对象适配器把被适配的对象放在适配器里初始化,这样就不需要继承被适配的对象了。

适配器:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

参考自:http://blog.csdn.net/jason0539/article/details/22468457
http://blog.csdn.net/guolin_blog/article/details/9400141

0 0