这段时间在学习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();
结果:
-------------------------------------------------------------------------------------
我在读数据
我在写数据
真好,正常运行,总体来看,电脑这个主体不需要做任何的修改,只需要在接口的地方做文章就行了,标准的接口我们拿来就用,特殊的,我们就加个适配器
看图片(画得很丑)
在这里牵扯到别的知识---适配器,但是我的目的是为了对接口编程的理解与操作!