结构型模式:适配器模式

我们可能遇到过这样的问题:我们新买了一个显示器,但是由于电脑是几年以前的,不能直接连上使用,需要在连接的时候,安装一个转接头。

还有,我们使用的手机充电线有一个大大的头,而不是直接一根线连在手机上,手机上的充电电压一般是5v,9v等,但绝不是220v。

还有苹果的手机等等,很多时候都会遇到需要转接头的时候。

在我们软件开发的过程中,比如对某个产品升级,但是还是要兼容原来老的接口,可以使用一个新的类,他可以继承原来的老类也可以使用组合使用老类,保证原来的接口继续受到兼容。这就需要我们现在说的适配器模式。简单的理解,适配器就是一个转接头。

这是适配模式的关系图。Adaptee类是被适配的类,Adapter2是适配器类,对类Adaptee进行一定的适配,使得Client类可以调用。假设Client是我们的手机,Adapter是手机充电线的变压器,Adaptee则是220v电流。经过Adapter的适配,Client可以使用220v的电来进行充电。看一下代码:

 1 public interface Target {
 2     public void doHandle();
 3 }
 4 
 5 Target的实现类Adapter
 6 public class Adapter extends Adaptee implements Target{
 7 
 8     @Override
 9     public void doHandle() {
10         super.requst();
11     }
12 
13 }
14 
15 public class Adaptee {
16     public void requst() {
17         System.out.println("执行了方法");
18     }
19 }
20 
21 public class Client {
22     public void test(Target t){
23         t.doHandle();
24     }
25     public static void main(String[] args) {
26         Client c = new Client();
27         Target t = new Adapter();
28         c.test(t);
29     }
30 }

上面是使用继承来实现的,下面将Adapter类和Client类稍加修改,使用组合实现适配器模式:

 1 public class Adapter2 implements Target{
 2 
 3     Adaptee adaptee;
 4     
 5     public Adapter2(Adaptee adaptee) {
 6         super();
 7         this.adaptee = adaptee;
 8     }
 9     
10     @Override
11     public void doHandle() {
12         adaptee.requst();
13     }
14 
15 }
16 
17 public class Client2 {
18     public void test(Target t){
19         t.doHandle();
20     }
21     public static void main(String[] args) {
22         Client2 c = new Client2();
23         Adaptee adaptee = new Adaptee();
24         Target t = new Adapter2(adaptee);
25         c.test(t);
26     }
27 }

只改变了这两个类,其他类不需要改变。

因为java是单继承的,继承了Adaptee类之后,就没有办法集成其他类,因此建议使用组合的适配器模式。

 

posted @ 2016-09-17 12:57  流浪在寂寞古城  阅读(200)  评论(0编辑  收藏  举报