这段时间在学习Spring,最重要的就是IoC(控制反转)和DI(依赖注入)这都是Spring的原理与机制,我突然想到Spring里还有一个挺重要的部分就是面向接口编程!
之前也有接触过,但是由于很多的原因没有认真的学习,今天花了一个多小时仔细了看了看,有点门路了!开始讲解一些我的认知!
首先拿日常生活中的问题来说明一下,我们都有电脑,这是统一标准的,还有就是存储设备,比U盘,Mp3播放器和移动硬盘,现在就他们的读数据与写数据进行讨论,假如让我写,我一定会先将写出他们的类FlashDiks、Mp3Palyer和MobileHardDisk,分别包含他们各自的Read与Write方法,然后分别在Computer里new出来!一眼看过去,确实很符合逻辑!但是假如以后还有新的存储器呢,那么就要对Computer进行重写,好比,我现在又买了一个存储器,就要把电脑拆开,安装存储器。。。这样的过程好繁琐,没有人愿意这样,于是接口编程出来了,改进代码如下:
写一个存储类统一接口IMobieStorage
public interface IMobileStorage { void Read();//读数据 void Write();//写数据 }统一的读数据与写数据,然后让设备中实现这些接口
U盘
public class FlashDisk implements IMobileStorage{ @Override public void Read() { System.out.println("FlashDisk Reading data...."); } @Override public void Write() { System.out.println("FlashDisk Writting data..."); } }Mp3Player:
public class Mp3Player implements IMobileStorage { @Override public void Read() { System.out.println("Mp3Player Reading data ...."); } @Override public void Write() { System.out.println("Mp3Player Writing data..."); } public void PlayMusic(){ System.out.println("Mp3Player playing music..."); } }移动硬盘MobileHardDisk
public class MobileHardDisk implements IMobileStorage { @Override public void Read() { System.out.println("MobileHardDisk Reading data..."); } @Override public void Write() { System.out.println("MobileHardDisk Writting data ...."); } }好了,这三个“生产”好了,在来看看电脑的结构,可定有接口让设备插入
public class Computer { //包含接口 private IMobileStorage mobileStorage; public IMobileStorage getMobileStorage() { return mobileStorage; } public void setMobileStorage(IMobileStorage mobileStorage) { this.mobileStorage = mobileStorage; } //电脑的读数据操作 public void ReadData(){ mobileStorage.Read(); } //电脑的写数据操作 public void WriteData(){ mobileStorage.Write(); } }电脑也准备好了,接下来就是买过设备之后的测试了、
test类:
public class test { public static void main(String[] args) { Computer computer = new Computer();//我有一台电脑 //我买了U盘 FlashDisk flashDisk = new FlashDisk(); //我也买了Mp3 Mp3Player mp3Player = new Mp3Player(); //我还有硬盘 MobileHardDisk mobileHardDisk = new MobileHardDisk(); //开始测试所有产品插在电脑上测试读数据与写数据功能 computer.setMobileStorage(flashDisk); computer.ReadData(); computer.WriteData(); computer.setMobileStorage(mp3Player); computer.ReadData(); computer.WriteData(); computer.setMobileStorage(mobileHardDisk); computer.ReadData(); computer.WriteData(); } }结果
FlashDisk Reading data....
FlashDisk Writting data...
Mp3Player Reading data ....
Mp3Player Writing data...
MobileHardDisk Reading data...
MobileHardDisk Writting data ....
到此,可以看到这三种设备均可以正常的运行!!!!
好的,看起来没什么特别的地方,突然有一天,我买了一个特殊的存储设备,插不进去电脑的接口,而且读写数据都不一样,怎么办阿?这里需要用到适配器的概念,说白了就是USB转换接口,你需要一个适配器一头插在电脑上一头接在存储设备上,然后又能正常存取了,实现方法
特别存储设备SpecialStorage:
public class SpecialStorage { public void Xie(){ System.out.println("我在写数据"); } public void Du(){ System.out.println("我在读数据"); } }看到没有,这个存储设备里面的读写方法很特别。。。很巧的是,买这个设备的时候,老板送了我一个“转换器”我就不要买了,真省钱
适配器SpecialStorageAdapter:
/* * 通过适配器模式Adapter将Du与Xie转换成Read与Writer */ public class SpecialStorageAdapter implements IMobileStorage { private SpecialStorage specialStorage; public SpecialStorage getSpecialStorage() { return specialStorage; } public void setSpecialStorage(SpecialStorage specialStorage) { this.specialStorage = specialStorage; } @Override public void Read() { specialStorage.Du(); } @Override public void Write() { specialStorage.Xie(); } }有了是适配器,赶快插在电脑上测试一下吧!(直接在test后面续写)
//买了特别的存储器 SpecialStorage specialStorage = new SpecialStorage(); //赠送了一个转换器 SpecialStorageAdapter adapter = new SpecialStorageAdapter(); //特别存储器插在转换器 adapter.setSpecialStorage(specialStorage); //再将转换器插在电脑上 computer.setMobileStorage(adapter); computer.ReadData(); computer.WriteData();结果:
-------------------------------------------------------------------------------------
我在读数据
我在写数据
真好,正常运行,总体来看,电脑这个主体不需要做任何的修改,只需要在接口的地方做文章就行了,标准的接口我们拿来就用,特殊的,我们就加个适配器
看图片(画得很丑)
在这里牵扯到别的知识---适配器,但是我的目的是为了对接口编程的理解与操作!