zoukankan      html  css  js  c++  java
  • JAVA适配器模式(从现实生活角度理解代码原理)

    说道JAVA中的适配器模式,不得不引用该设计模式的固定表述“适配器模式(Adapter ):将一个类的接口转换成客户希望的另外一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作”。该模式其实类似于90年代那会的稳压器,当时的电压没有现在这样稳定,看电视的时候经常会出现闪屏的现象,为此爷爷专门通过工作关系渠道搞到全村第一台稳压器(见下图,哎老爷子拍照之前也不说弄弄干净尴尬,大伙凑合看下),从此开启了童年里幸福的观影时光。

    现在21世纪了,除了老旧的稳压器外,各种各样的适配器已经是随处可见了(各种手机充电适配器,电脑电源适配器等等),这里为了方便大家理解,我们用做常用的电脑电源适配器来讲解今天的设计模式,首先要明确的是在这整个过程中我们只有三个具体的对象,分别是电源(插座)、适配器,电脑(电池)。下来我们开始撸代码:

     1 /*首先我们需要建立一个电源(插板)的接口,并提供对应方法
     2  * (之所用接口是为了方便适配器实现)
     3  */
     4 interface Power{
     5     public void electric();
     6 }
     7 //首先我们需要建立一个电脑的接口,并提供对应方法
     8 interface Computer{
     9     public void battery();
    10 }
    11 //建立分别实现两个接口的类
    12 class PowerImpl implements Power{
    13     @Override
    14     public void electric() {
    15         System.out.println("我有电");
    16     }
    17 }
    18 class ComputerImpl implements Computer{
    19     @Override
    20     public void battery() {
    21         System.out.println("我有电池");
    22     }
    23 }
    24 /*
    25  * 建造适配器(这里我个人认为作为适配器,应该同时实现他所连接的两个接口
    26  * ,在这里就是电源和电脑的接口)
    27  */
    28 class Adapter implements Power,Computer{
    29     /*适配器中声明名两个接口,并分别建立构造方法
    30      * (适配器中应该有支持两种接口的模块)
    31      */
    32     Power power;
    33     Computer computer;
    34     
    35     public Adapter(Power power) {
    36         super();
    37         this.power = power;
    38     }
    39     public Adapter(Computer computer) {
    40         super();
    41         this.computer = computer;
    42     }
    43     /*适配器核心代码:
    44      * 可以理解为要实现电脑电池充电的方法,就必须调用电源的电方法。
    45      * 同理在这个过程中电源的电要实现自身价值,就必须调用电脑的电池。
    46      */
    47     @Override
    48     public void battery() {
    49         power.electric();
    50     }
    51     @Override
    52     public void electric() {
    53         computer.battery();
    54     }
    55 }


    测试类一:这里模拟在有电的情况下(即适配器一端已经连接电源插板),通过适配器调用电脑电池的过程

    public class AdapterDemo {
        public static void main(String[] args) {
            Computer computer = new ComputerImpl();//实例化Computer(父类引用指向子类对象)
            Adapter a = new Adapter(computer);//实例化适配器,可以理解为将另外一端连接到电脑的过程
            method(a);
        }
        //静态方法(已经提供了电)
        public static void method(Power p){
            p.electric();
        }
    }

    输出结果:

     1 我有电池 

    测试类二:这里模拟在有电脑(电池)的情况下(即适配器一端已经连接电脑),通过适配器调用power的过程

     1 public class AdapterDemo1 {
     2     public static void main(String[] args) {
     3         Power power = new PowerImpl();//实例化Power(父类引用指向子类对象)
     4         Adapter a = new Adapter(power);
     5         method(a);
     6     }
     7     //静态方法(已经提供了电脑)
     8     public static void method(Computer c){
     9         c.battery();
    10     }
    11 }

    输出结果:

     1 我有电 


    这里写的比较规矩,方便初学者理解,大家也可以通过匿名内部类来简化(优化)这段代码,祝大伙撸的开心安静

  • 相关阅读:
    python 包管理工具 pip 的配置
    Python 变量作用域 LEGB (下)—— Enclosing function locals
    Python 变量作用域 LEGB (上)—— Local,Global,Builtin
    2020 Java 面试题 小结 (答案慢慢补上,有错误请指出)
    mysql 根据日期(date)做年,月,日分组统计查询
    jvm指令
    正则表达式 分割地址 获取省市区详细地址
    .Net 异常记录
    WCF设计服务协议(一)
    plsql ORA-01789:查询块具有不正确的结果列数
  • 原文地址:https://www.cnblogs.com/panhouye/p/6104288.html
Copyright © 2011-2022 走看看