面向接口编程之粗暴理解
我们可以将面向接口编程简单理解为,从解决一件事扩展到解决一类事
案例源码在文章末尾,自取
为什么会有接口一说?
可能这么说还比较抽象,那么就用我们熟知的电脑做案例解释下
众所周知,原始的鼠标使用的是圆形的插口,可以理解为圆形的接口,如下代码
public interface Circle{
void Connect();//圆孔鼠标的连接功能
}
但圆形插口扩展性不好,只能支持鼠标一种外设 其他设备需要另外开辟接口,这样下去迟早资源耗尽
这时一堆dalao聚集在一起,约定了USB协议(接口)
public interface USB{
void Connect();//USB设备的连接功能
}
只要实现了USB接口的外接设备,都可以通过USB被电脑所识别
所以直接(在数不胜数的程序员和大牛在度过了的那一个个令人头秃的凌晨后终于)有了面向接口编程的思想
所以,只要对象实现了特定功能的接口,他就能通过该相同的接口完成各种各样的事情
直接的用途是,每出一件电脑外设,只要它遵循USB接口(协议),它就能连入电脑工作
那么问题来了,这和我们程序员有什么关系呢?
不知道大家发现没有,这里每一件外设只要遵循USB接口(协议)就能正常工作
我们不用为每一件新出的外设单独编写程序了!!!
关于外设是如何实现USB接口的,厂商以外的人是无法知道的,这是厂商所希望的
这时,就实现了外设在电脑上工作和对USB接口实现的分离
厂商的铁饭碗保住了,程序员的工作量也有所减轻
故事讲完了,下面开始上代码
using System;
namespace InterfaceExample
{
//向上提取,得到大部分外设都遵守的USB接口(协议),只要外接实现该接口,就可以连入电脑
public interface USB{
void Connect();//USB设备的连接功能
}
public class Mouse : USB
{
//让鼠标遵循USB协议,实现鼠标与电脑间连接和断开的功能
public void Connect()
{
//这里用一句输出语句,模拟鼠标实现USB接口的操作
Console.WriteLine("鼠标成功接入电脑!");
}
}
public class Keyboard : USB
{
//让键盘遵循USB协议,实现键盘与电脑间连接和断开的功能
public void Connect()
{
Console.WriteLine("键盘成功接入电脑!");
}
}
//扩展到任意一个外接设备
public class OutDevice : USB{
//这是任意一个外接设备,它实现了USB接口
public void Connect()
{
Console.WriteLine("外接设备成功接入电脑!");
}
}
//上面的这些就是外设生产商(键盘生产商、鼠标生产商)的铁饭碗
}
生产商如何使外设实现USB接口的其他人都无法知道
但是我们可以通过他们都实现了的USB接口来运行他们
可以类比:把键盘和鼠标USB插进电脑,就可以正常使用了!
class USBInterface{
//所以,这里我们定义了一个将外设连接入电脑的功能
public static void ConnectComputer(USB usb){
usb.Connect();
}
public static void Main(string[] args)
{
//厂商生产了一个键盘一个鼠标和一个任意外设
Keyboard keyboard = new Keyboard();
Mouse mouse = new Mouse();
OutDevice outdevice = new OutDevice();
//用户通过USB接口将三个设备连接入电脑
ConnectComputer(keyboard);
ConnectComputer(mouse);
ConnectComputer(outdevice);
Console.ReadLine();
}
}
这样我们就将鼠标键盘推广到了任意的外设,只要外设实现了USB接口(协议),它就能和电脑建立联系,正常工作
最后引用某位网友的问答
1 首先什么是面向接口编程?
面向接口编程就是先把客户的业务逻辑线提取出来,作为接口,业务具体实现通过该接口的实现类来完成。
当客户需求变化时,只需编写该业务逻辑的新的实现类,通过更改配置文件(例如Spring框架)中该接口
的实现类就可以完成需求,不需要改写现有代码,减少对系统的影响。
2 面向接口编程的优点?
降低程序的耦合性。其能够最大限度的解耦,所谓解耦既是解耦合的意思,它和耦合相对。耦合就是联系 ,耦合越强,联系越紧密。在程序中紧密的联系并不是一件好的事情,因为两种事物之间联系越紧密,你更换 其中之一的难度就越大,扩展功能和debug的难度也就越大。
易于程序的扩展;
有利于程序的维护;
PS:为了内容理解的难易程度,请读者不要纠结历史细节问题
源码链接
https://www.jianshu.com/p/62ca1ed84cc5