设计模式(五)适配器模式
结构型模式:
核心作用:是从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题。
分类:适配器模式、代理模式、桥接模式、装饰模式、组合模式、外观模式、享元模式
适配器模式:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于不兼容而不能一起工作的那些类可以在一起工作。
模式中的角色:
——目标接口(Target):客户机所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
——需要适配的类(Adaptee):需要适配的类或适配者类。
——适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。
如上图所示:Client相当于一台笔记本(只有USB口),Target相当于一个USB接口,Adapter相当于一个适配器,Adaptee相当于一个带有PS/2接口的键盘。
现在想要键盘与笔记本连接。
1. 创建一个客户端类
1 package adapter; 2 /*** 3 * 客户端类 4 * 相当于笔记本,只有USB接口 5 * @author ZTQ 6 * 7 */ 8 public class Client { 9 public void test1(Target t){ 10 t.handleReq(); 11 } 12 13 public static void main(String[] args) { 14 Client c = new Client(); 15 16 Adaptee a = new Adaptee(); 17 18 Target t = new Adapter(); 19 // Target t = new Adapter2(a); 20 21 c.test1(t); 22 } 23 }
2. 创建一个被适配的类。
1 package adapter; 2 /*** 3 * 被适配的类 4 * 相当于PS/2键盘 5 * @author ZTQ 6 * 7 */ 8 public class Adaptee { 9 public void request(){ 10 System.out.println("可以完成客户需要的功能!"); 11 } 12 }
3. 创建一个Target接口。
1 package adapter; 2 3 public interface Target { 4 void handleReq(); 5 }
4. 创建一个适配器类。
1 package adapter; 2 /*** 3 * 适配器(类适配器方式) 4 * 相当于USB和PS/2的转换器 5 * @author ZTQ 6 * 7 */ 8 public class Adapter extends Adaptee implements Target{ 9 10 @Override 11 public void handleReq() { 12 super.request(); 13 } 14 15 }
或者
1 package adapter; 2 /*** 3 * 适配器(对象适配器方式,使用了组合的方式跟被适配对象整合) 4 * 相当于USB和PS/2的转换器 5 * @author ZTQ 6 * 7 */ 8 public class Adapter2 extends Adaptee implements Target{ 9 10 private Adaptee adaptee; 11 12 @Override 13 public void handleReq() { 14 adaptee.request(); 15 } 16 17 public Adapter2(Adaptee adaptee) { 18 super(); 19 this.adaptee = adaptee; 20 } 21 22 }
5. 运行结果。
可以完成客户需要的功能!
工作中的场景:
--经常用来做旧系统改造和升级。
--如果我们的系统开发之后再也不需要维护,那么很多模式都是没必要的。但是不幸的是,事实却是维护一个系统的代价往往是开发一个系统的数倍。
我们学习中见过的场景:
--java.io.InputStreamReader(InputStream)
--java.io.OutputStreamWriter(OutputStream)