• 3.适配器模式


    【基本介绍】

      适配器模式将某个类的接口转换成客户端期望的另一个接口表示,主要目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作,起别名为包装器。主要分为:类适配器模式、对象适配器模式、接口适配器模式。

    1.类适配器模式

      案例说明:将220V交流电(src 被适配者)通过充电器(相当于Adapter)转换成5V(dst 目标)。

      Adapter通过继承src类,实现dst类的接口完成 src-》dst的适配。

    1 //适配接口
    2 public interface IVoltage5V {
    3     public int output5V();
    4 }
    5V电流接口
     1 public class Phone {
     2     //充电
     3     public void charging(IVoltage5V iVoltage5V) {
     4         if(iVoltage5V.output5V() == 5) {
     5             System.out.println("电压为5V, 可以充电~~");
     6         } else if (iVoltage5V.output5V() > 5) {
     7             System.out.println("电压大于5V, 不能充电~~");
     8         }
     9     }
    10 }
    手机类(接口应为5V)
    1 //被适配的类
    2 public class Voltage220V {
    3     //输出220V的电压
    4     public int output220V() {
    5         int src = 220;
    6         System.out.println("电压=" + src + "伏");
    7         return src;
    8     }
    9 }
    22V交流电类
     1 //适配器类
     2 public class VoltageAdapter extends Voltage220V implements IVoltage5V {
     3     @Override
     4     public int output5V() {
     5         // TODO Auto-generated method stub
     6         //获取到220V电压
     7         int srcV = output220V();
     8         int dstV = srcV / 44 ; //转成 5v
     9         return dstV;
    10     }
    11 }
    充电器Adapter
    1 public class Client {
    2     public static void main(String[] args) {
    3         // TODO Auto-generated method stub
    4         System.out.println(" === 类适配器模式 ====");
    5         Phone phone = new Phone();
    6         phone.charging(new VoltageAdapter());
    7     }
    8 }
    开始充电

     2.对象适配器模式

      基本思路和类适配器模式相同,只是将Adapter类做修改,不在继承src(220V)类(使用组合代替继承),而是持有src类的实例(作为成员变量,通过构造器传入),以解决兼容性问题。即 持有src类,实现dst类的接口完成 src-》dst的适配。

     1 //适配器类
     2 public class VoltageAdapter  implements IVoltage5V {
     3 
     4     private Voltage220V voltage220V; // 关联关系-聚合
     5     
     6     //通过构造器,传入一个 Voltage220V 实例
     7     public VoltageAdapter(Voltage220V voltage220v) {
     8         this.voltage220V = voltage220v;
     9     }
    10     
    11     @Override
    12     public int output5V() {
    13         int dst = 0;
    14         if(null != voltage220V) {
    15             int src = voltage220V.output220V();//获取220V 电压
    16             System.out.println("使用对象适配器,进行适配~~");
    17             dst = src / 44;
    18             System.out.println("适配完成,输出的电压为=" + dst);
    19         }
    20         return dst;
    21     }
    22 }
    适配器
    1 public class Client {
    2     public static void main(String[] args) {
    3         // TODO Auto-generated method stub
    4         System.out.println(" === 对象适配器模式 ====");
    5         Phone phone = new Phone();
    6         phone.charging(new VoltageAdapter(new Voltage220V()));
    7     }
    8 }
    开始充电

    3.接口适配器模式

       当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可有选择的覆盖父类的某些方法来实现需求。适用于一个接口不想使用其所有的方法的情况。

    1 public interface Interface4 {
    2     public void m1();
    3     public void m2();
    4     public void m3();
    5     public void m4();
    6 }
    接口
     1 //在AbsAdapter 我们将 Interface4 的方法进行默认实现
     2 public abstract class AbsAdapter implements Interface4 {
     3     //默认实现(空方法)
     4     public void m1() {
     5     }
     6     public void m2() {
     7     }
     8     public void m3() {
     9     }
    10     public void m4() {
    11     }
    12 }
    抽象类
     1 public class Client {
     2     public static void main(String[] args) {
     3         AbsAdapter absAdapter = new AbsAdapter() {
     4             //只需要去覆盖我们 需要使用 接口方法
     5             @Override
     6             public void m1() {
     7                 // TODO Auto-generated method stub
     8                 System.out.println("使用了m1的方法");
     9             }
    10         };
    11         absAdapter.m1();
    12     }
    13 }
    测试
  • 相关阅读:
    各个控件说明
    html常用
    abp.message
    ABP框架——单表实体流程
    AngularJS $http和$.ajax
    AngularJS ng-if使用
    AngularJS 多级下拉框
    AngularJS 计时器
    AngularJS table循环数据
    Python之待学习记录
  • 原文地址:https://www.cnblogs.com/qmillet/p/12112038.html
Copyright © 2020-2023  润新知