设计模式学习笔记——适配器模式
正好看到Android中使用ListAdapter往ListView中添加信息,想起来Adapter适配器设计模式,拿出来学习了下
?
适配器模式的定义
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。(GoF)
?
综合一些资料来看,适配器达到的目的基本就是我有一个接口,而如今我需要扩展这个接口来实现一些新的特定功能,而这些功能又已经包含在了其他类中。我们自然是希望可以直接去使用这些已经写好的方法,而不用自己再动手,这时就用到了适配器模式,即创建一个新的类作为2者之间的桥梁
?
适配器模式有2种形式:类适配器,对象适配器
?
首先是类适配器
?
盗用一下UML图,这次没有自己画

public interface Target {public void Request();}?已经实现了我们需要方法的Adaptee类public class Adaptee {public void SpecificRequest(){System.out.print("I'm SpecialRequest");}}?创建一个Adapter将两者连接起来public class Adapter extends Adaptee implements Target{public void Request() {super.SpecificRequest();}}?最终我们在Client中就可以直接使用该方法而不需要重复编码了public class Client {public static void main(String args[]){Target target=new Adapter();target.Request();}}?在这基础上,我们碰到了一个问题,如果我们的Target方法要实现多个Request,而这些Request又分别在不同的类中有实现,那怎么办,按照上面的办法,我们必须extends 1 2 3,但是Java是不允许多重继承的这时,就出现了适配器类的第二种形式:对象适配器同样盗用一张UML图
public interface Target {public void Request1();public void Request2();public void Request3();}?现有的Adaptee类1、2、3public class Adaptee1 {public void SpecificRequest1(){System.out.println("I'm SpecialRequest1");}}public class Adaptee2 {public void SpecificRequest2(){System.out.println("I'm SpecialRequest2");}}public class Adaptee3 {public void SpecificRequest3(){System.out.println("I'm SpecialRequest3");}}?实现我们自己的适配器来连接2者public class Adapter implements Target{private Adaptee1 adaptee1;private Adaptee2 adaptee2;private Adaptee3 adaptee3;public Adapter(Adaptee1 ad1,Adaptee2 ad2,Adaptee3 ad3){this.adaptee1=ad1;this.adaptee2=ad2;this.adaptee3=ad3;}public void Request1(){adaptee1.SpecificRequest1();}public void Request2(){adaptee2.SpecificRequest2();}public void Request3(){adaptee3.SpecificRequest3();}}?最终在Client中使用public class Client {public static void main(String args[]){Adaptee1 ad1=new Adaptee1();Adaptee2 ad2=new Adaptee2();Adaptee3 ad3=new Adaptee3();Target target=new Adapter(ad1,ad2,ad3);target.Request1();target.Request2();target.Request3();}}?适配器并不是通过继承来获取适配类(原)的功能的,而是通过适配类的对象来获取的,这就解决了java不能多继承所带来的不便了。这也是java提倡的编程思想之一,即尽量使用聚合不要使用继承。?public class Target {public void Request(){System.out.println("I'm Request");}}?Adaptee类public class Adaptee {public void SpecificRequest(){System.out.print("I'm SpecialRequest");}}?实现的Adapterpublic class Adapter extends Target{private Adaptee ad;public Adapter(Adaptee ad){super();this.ad=ad;}public void Request(){ad.SpecificRequest();}}?Client中的使用public class Client {public static void main(String args[]){Adaptee ad=new Adaptee();Target target=new Adapter(ad);target.Request();}}?即 将Adaptee聚合到Adapter中?
楼主顶一个 楼主顶一个