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


    结构型模式:

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

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


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

  • 相关阅读:
    开源大数据周刊-第29期
    rsync
    Tomcat基础教程(四)
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    python 取前10位
    python 字典统计次数
    阿里开源分布式事务Fescar demo示例
  • 原文地址:https://www.cnblogs.com/zhangtianq/p/6012155.html
Copyright © 2020-2023  润新知