设计模式之适配器模式
在网上看了很多关于适配器设计模式的博客,感觉还是要靠自己去领悟这些设计模式,动手去写,最好结合生活当中的例子。
因为光看是学不会的,面向对象本来就是来自生活,来自生活中一个个鲜活的对象,不过它又是抽象的。
首先简单说下个人的理解,适配器,就是一个能够把原来我们不能去很方便地使用的东西转换成我们能够去使用的东西。
最简单的例子就是我们生活当中常见的手机或者电脑的适配器(充电器),它的功能就是把220v的电压转换成我们手机或电脑能使用的电压。
上图就是适配器模式的三个主要角色
首先要说明的是:Target和Adaptee没有任何的关系,只是有相同的一个方法名。
Target:目标。客户端需要使用的角色。在我们手机使用适配器充电的事件的体现就是我们手机需要的电压。
Adaptee:适配者(被改造者),需要进行转换的角色。在我们手机使用适配器充电的事件的体现就是220v的电压。
Adapter:适配器,作为Target和Adaptee间的一个桥梁,起到转换Adaptee成为符合Target标准的一个作用。在我们手机使用适配器充电的事件的体现就是充电器。
那么就以上面手机充电的例子进行编码,然后进行说明。
Target:目标角色,这是一个输出电流的接口。只有一个outStream(),这个是输出电流的方法。现在假设我们的手机需要的是5v的电压,这个数值后面会有用。
1 public interface Target { 2 3 int outStream(); 4 5 }
Apaptee:适配者。定义了一个与Target中定义的同名的outStream(),此方法返回的是我们生活的电压,220v
1 public class Adaptee { 2 public int outStream() { 3 System.out.println("Adaptee-->out220V"); 4 return 220; 5 } 6 }
Adapter:适配器,这个适配器继承了Adaptee类和实现了Target接口,然后复写了outStream()
1 public class Adapter extends Adaptee implements Target { 2 3 @Override 4 public int outStream(){ 5 System.out.println("对"+super.outStream()+"V进行转换...."); 6 System.out.println("现在是5V"); 7 return 5; 8 } 9 }
Phone:手机类,只有一个充电的方法,接受的是一个int类型的电压
1 public class Phone { 2 3 public void inStream(int v) { 4 if (v == 220) { 5 System.out.println("现在电压再充手机就要爆炸!"); 6 } 7 if (v == 5){ 8 System.out.println("5v电压可以充电!"); 9 } 10 } 11 }
Client:客户端
1 public class Client { 2 3 public static void main(String[] args) { 4 System.out.println("适配器模式:--------------------------"); 5 Target target = new Adapter(); 6 Phone p1 = new Phone(); 7 p1.inStream(target.outStream()); 8 9 System.out.println(); 10 11 System.out.println("非适配器模式:--------------------------"); 12 //不使用适配器 13 Adaptee adaptee = new Adaptee(); 14 Phone p2 = new Phone(); 15 p2.inStream(adaptee.outStream()); 16 } 17 }
运行结果:
适配器模式:--------------------------
Adaptee-->out220V
对220V进行转换....
现在是5V
5v电压可以充电!
非适配器模式:--------------------------
Adaptee-->out220V
现在电压再充手机就要爆炸!
说明:
适配器设计模式的精髓:
1)在这个例子中,我们的Target接口和Apaptee都定义了同名的outStream(),然后我们的Adapter继承Apaptee和实现Target。因为它从的父类中继承了outStream(),
所以不用复写方法了。要复写的话上面Apdapter就是例子。
2)同时Target的outStream()是我们Client要调用的方法,在通过创建Apater为Target实例化的例子中,Client端调用Target的方法就是通过适配器处理后的方法,也是间接得调用了Adaptee的方法。重点是,达到了我们不改变Target和Adaptee的关系的前提下完成我们的任务。
就写到这里吧, 水平一般,如果写得哪里不对,欢迎大家评论。
上一篇: 孩子们又爱又恨的爆笑冷爸