设计模式(五)适配器模式

结构型模式:

  核心作用:是从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题。

  分类:适配器模式、代理模式、桥接模式、装饰模式、组合模式、外观模式、享元模式


 

适配器模式:将一个类的接口转换成客户希望的另外一个接口。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)

 

posted @ 2016-11-12 21:06  Chris_z  阅读(400)  评论(0编辑  收藏  举报