• 面向接口编程及适配器模式


         今日在网上看到一篇有关面向接口编程的博客,初看不太理解,故自己一边测试一边理解。总结如下:

         测试用例:开发一个应用,模拟移动存储设备的读写,即计算机与U盘、MP3、移动硬盘等设备进行数据交换。要求计算机能同这三种设备进行数据交换,并且以后可能会有新的第三方的移动存储设备,所以计算机必须有扩展性,能与目前未知而以后可能会出现的存储设备进行数据交换。

     第一种:面向类编程

          1、定义一个U盘,FlashDisk.java 类,实现读写两个方法。

    package com;
    
    public class FlashDisk {
        public void Read() {
            System.out.println("FlashDisk Read");
        }
    
        public void Write() {
            System.out.println("FlashDisk Write");
        }
    }

          2、定义一个电脑 ,Computer.java 类,定义一个RWData方法,调取U盘的读写  

    package com;
    
    public class Computer {   
        public void RWData() {
            FlashDisk flashDisk = new FlashDisk(); //启动U盘
            flashDisk.Read();
            flashDisk.Write();
        }
    }

          3、测试,test.java类

    package com;
    
    public class test {
        public static void main(String[] args) {
            Computer computer = new Computer(); // 启动电脑
            computer.RWData(); //调用 处理U盘的方法
        }
    }

          总结:通过这种最基本的方法实现,当再添加一个进行对MP3的读写时,需要对Computer类再添加对MP3的读写,用在实际生活中,就得把电脑拆开重新改造,缺乏可扩展性。

     第二种:面向接口编程

          1、定义一个接口,IMobile.java类,定义读、写方法。(接口的目的是为了同一标准,让所有的电器都按这个标准创建,实现统一管理,可参考现实中USB接口的实现原理)

    package com;
    
    public interface IMobile {
    
        public void Read();
    
        public void Write();
    }

          2、改造U盘,FlashDisk.java 类,使其实现IMobile 接口

    package com;
    
    public class FlashDisk implements IMobile{
        public void Read() {
            System.out.println("FlashDisk Read");
        }
    
        public void Write() {
            System.out.println("FlashDisk Write");
        }
    }

          3、改造电脑,Computer.java类,通过其对接口的操作,操作所有基于该接口开发的电器 

    package com;
    
    public class Computer {
    
        private IMobile usbDrive; // 在电脑中安装USB插槽
    
        public IMobile getUsbDrive() {
            return usbDrive;
        }
    
        public void setUsbDrive(IMobile usbDrive) {
            this.usbDrive = usbDrive; // 启动插槽,初始化插入该USB的设备
        }
    
        // 电脑为使用者 提供统一的读、写操作
        public void RWData() {
            usbDrive.Read(); // 调用插入该USB的设备的读写方法,
            usbDrive.Write();
        }
    
    }

           4、修改测试,test.java类

    package com;
    
    public class test {
        public static void main(String[] args) {
            Computer computer = new Computer(); // 启动电脑
            IMobile flashDisk = new FlashDisk(); // 拿出U盘
            computer.setUsbDrive(flashDisk); // 把U盘插入USB插槽,电脑开始初始化U盘
            computer.RWData();
        }
    }

           后续扩展:

           面向接口编程的结构已基本成型,电脑已经可以针对U盘进行读写了,此时,如果要添加对MP3的读写,只需要再定义一个MP3的类,使其实现公共接口。

           1、定义一个MP3,MP3Player类,使其实现IMobile 接口

    package com;
    
    public class MP3Player implements IMobile {
    
        @Override
        public void Read() {
            System.out.println("MP3Player Read");
        }
    
        @Override
        public void Write() {
            System.out.println("MP3Player Write");
        }
    
    }

           2、为电脑添加对MP3的操作已完成,修改测试,test.java类

    package com;
    
    public class test {
        public static void main(String[] args) {
            Computer computer = new Computer(); // 启动电脑
            
            IMobile flashDisk = new FlashDisk(); // 拿出U盘
            computer.setUsbDrive(flashDisk); // 把U盘插入USB插槽,电脑开始初始化U盘
            computer.RWData();
            
            IMobile mP3Player=new MP3Player();// 拿出MP3
            computer.setUsbDrive(mP3Player); // 把MP3插入USB插槽,电脑开始初始化MP3
            computer.RWData();
        }
    }

           总结:通过面向接口编程,提高了程序的扩展性,如需电脑需要处理新的媒体,只需要定义一个新媒体的类,使其实现公共接口即可。那么问题来了,如果定义的新的媒体没有按照公共接口进行的设计,比如:有的设备连接电脑的接口是长方形的,有的为正方形的,接口对不上,那么就要使用适配器模式,把接口通过适配器统一口径。

           技术引申,适配器模式

           1.定义一个新的媒体,NewMachine.java类,其读写用的方法与上面的不同(此时该类不能实现公共接口)

    package com;
    
    public class NewMachine{
    
        public void Rd() {
            System.out.println("NewMachine Read");
        }
    
        public void Wt() {
            System.out.println("NewMachine Write");
        }
    
    }

         2.定义一个适配器,NewMachineAdapter.java类,使该适配器实现公共接口。这样电脑就可以在不更改的情况下,操作适配器的读写

           该过程一步步来,首先写个框架:     

    package com;
    
    public class NewMachineAdapter implements IMobile {
    
        @Override
        public void Read() {
            //调用新设备的读操作
        }
    
        @Override
        public void Write() {
            //调用新设备的写操作
        }
    
    }

         在适配器类中,通过适配器再对新媒体进行操作,更改NewMachineAdapter.java

    package com;
    
    public class NewMachineAdapter implements IMobile {
    
        private NewMachine newMachine;
    
        public NewMachine getNewMachine() {
            return newMachine;
        }
    
        public void setNewMachine(NewMachine newMachine) {
            this.newMachine = newMachine;
        }
    
        @Override
        public void Read() {
            // 调用新设备的读操作
            this.newMachine.Rd();
        }
    
        @Override
        public void Write() {
            // 调用新设备的写操作
            this.newMachine.Wt();
        }
    
    }

         3.修改测试,test.java类

    package com;
    
    public class test {
        public static void main(String[] args) {
            Computer computer = new Computer(); // 启动电脑
    
            IMobile flashDisk = new FlashDisk(); // 拿出U盘
            computer.setUsbDrive(flashDisk); // 把U盘插入USB插槽,电脑开始初始化U盘
            computer.RWData();
    
            IMobile mP3Player = new MP3Player();// 拿出MP3
            computer.setUsbDrive(mP3Player); // 把MP3插入USB插槽,电脑开始初始化MP3
            computer.RWData();
    
            NewMachineAdapter adapter = new NewMachineAdapter(); // 拿出适配器
            NewMachine newMachine = new NewMachine(); // 拿出新媒体设备
            adapter.setNewMachine(newMachine); // 把新媒体设备安装在适配器上
            computer.setUsbDrive(adapter); // 把适配器插入USB插槽,电脑开始初始化新媒体
            computer.RWData();
        }
    }

        

  • 相关阅读:
    2440中断
    2440内存管理
    printf不定参数
    时钟体系
    Uart串口
    链接脚本与重定位
    指令速记
    OpenOCD-JTAG调试
    ATPCS规则
    ARM三级流水线
  • 原文地址:https://www.cnblogs.com/sky-/p/4610079.html
Copyright © 2020-2023  润新知