zoukankan      html  css  js  c++  java
  • 设计模式:适配器模式

    设计模式:适配器模式

    一、适配器模式介绍

      适配器模式分为两类,所谓“适配”就是适当的配合或者恰当的配合,想一下电源的适配器,完成的作用是将交流电220V转化成不同的直流电压,来对手机、电脑、台灯等充电,如果没有这些适配器,我们的设备早就着火了或者报废了,是一件很可怕的事情,那么适配器就是起到一个转换的作用,将物质(数据)由某种形式转换成另一种形式,使得适配后的一方能够接收和使用,那么我们通过分析也知道,适配器中的角色大体上分为三种使用适配器的角色(手机等)、适配器本身(适配器)、被适配的角色(交流电)。可是作为高内聚低耦合的设计思想指导,我们在手机和适配器中间再加上一层接口,手机直接使用这个接口来使用适配器,而不是高耦合的直接使用,因此主要的角色就有四个了。再考虑到适配器和被适配的角色之间的适配方式,我们可以使用继承来适配也可以使用组合来适配,因此,适配器也就分为通过使用继承的适配器——类适配器和使用组合(委托)的适配器——对象适配器

    二、类适配器

     

    Banner 类代码:

     1 package zyr.dp.adapter;
     2 
     3 public class Banner {
     4    private String name;
     5    public Banner(String name){
     6        this.name=name;
     7    }
     8    public void showWithParen(){
     9        System.out.println("("+name+")");
    10    }
    11    public void showWithAster(){
    12        System.out.println("*"+name+"*");
    13    }
    14 }

    Print 接口:

    1 package zyr.dp.adapter;
    2 
    3 public interface Print {
    4   public abstract void printWeak();
    5   public abstract void printStrong();
    6 }

    PrintBanner 类的代码:

     1 package zyr.dp.adapter;
     2 
     3 public class PrintBanner extends Banner implements Print {
     4 
     5     public PrintBanner(String name) {
     6         super(name);
     7     }
     8 
     9     public void printWeak() {
    10         System.out.println("...开始弱适配...");
    11         showWithParen();
    12         System.out.println("...弱适配成功...");
    13         System.out.println();
    14     }
    15 
    16     public void printStrong() {
    17         System.out.println("...开始强适配...");
    18         showWithAster();
    19         System.out.println("...强适配成功...");
    20         System.out.println();
    21     }
    22 }

    运行结果:

      可以看到使用适配器,我们将Banner对象这个很高的电压通过PrintBanner这个适配器进行适配之后,通过main函数进行使用,使用的时候通过Print接口进行引用,便于程序的可扩展性,比如说还有一个适配器对字符串进行了处理,我们只用在main中修改非常少的代码即可以使用,这样就低内聚高耦合了。

    三、对象适配器

    Banner类:

     1 package zyr.dp.adapter.objectpattern;
     2 
     3 public class Banner {
     4    private String name;
     5    public Banner(String name){
     6        this.name=name;
     7    }
     8    public void showWithParen(){
     9        System.out.println("("+name+")");
    10    }
    11    public void showWithAster(){
    12        System.out.println("*"+name+"*");
    13    }
    14 }

    Print抽象类:

    1 package zyr.dp.adapter.objectpattern;
    2 
    3 public abstract class Print {
    4   public abstract void printWeak();
    5   public abstract void printStrong();
    6 }

    PrintBanner类:

     1 package zyr.dp.adapter.objectpattern;
     2 
     3 public class PrintBanner extends Print {
     4 
     5     Banner banner;
     6     public PrintBanner(String name) {
     7         banner=new Banner(name);
     8     }
     9 
    10     public void printWeak() {
    11         System.out.println("...开始弱适配...");
    12         banner.showWithParen();
    13         System.out.println("...弱适配成功...");
    14         System.out.println();
    15     }
    16 
    17     public void printStrong() {
    18         System.out.println("...开始强适配...");
    19         banner.showWithAster();
    20         System.out.println("...强适配成功...");
    21         System.out.println();
    22     }
    23 }

    Main函数:

     1 package zyr.dp.adapter.objectpattern;
     2 
     3 public class Main {
     4 
     5     public static void main(String[] args) {
     6         Print p=new PrintBanner("朱彦荣");
     7         p.printStrong();
     8         p.printWeak();
     9     }
    10 }

       可以看到Main函数、Banner类都没有改动,将Print接口变成抽象类,那么PrintBanner不能同时继承两个类,因此将Banner对象组合到适配器之中,因此叫做对象适配器,这样也可以实现预期的结果。两者的区别也是非常明显的,最好推荐使用前者,或者根据实际情况需要进行甄别。

    四、总结

      适配器模式有两种,我们需要根据实际情况来使用,在实际情况之中,我们可能使用一些已经封装好的代码,有的时候需要对其进行稍微的修改,可是这些代码同时被其他组件所使用,我们不能在原来的程序上改动,因此通过适配器模式,我们将这些代码进行进一步的处理,然后再使用,这样的设计方法是非常好的,因为我们保证了在不修改原来的代码的情况下实现了代码的复用和个性化。一般用在系统升级的时候,需要保证兼容性,我们将新系统作为被适配对象,通过自己定义的适配器保证在旧系统上依旧可以使用之前的功能,保证了兼容性。也用在使用别人的代码的时候。但是如果被适配的角色的功能和最终我们使用的功能完全不同时,适配器是不能使用的,不能将电流适配成水流的。

      程序代码

  • 相关阅读:
    一条Sql的Spark之旅
    Redis学习笔记:Redis在C#中的使用
    MySQL_表操作
    git上传新项目到coding
    Jenkins 安装 on centos7
    day 36
    表单生成器(Form Builder)之表单数据存储结构mongodb篇
    ORA-16032和ORA-07286 LOG_ARCHIVE_DEST_1没生效
    SQL查询小案例
    mysql从5.6升级到5.7后出现 Expression #1 of ORDER BY clause is not in SELECT list,this is incompatible with DISTINCT
  • 原文地址:https://www.cnblogs.com/zyrblog/p/9218316.html
Copyright © 2011-2022 走看看