C#面向接口编程(一)
面向接口编程(IOP)
面向接口编程(Interface Oriented Programming:OIP)是一种编程思想,接口作为实体抽象出来的一种表现形式,用于抽离内部实现进行外部沟通,最终实现内部变动而不影响外部与其他实现交互,可以理解成按照这种思想来设计编程的方式就可以称为面向接口编程。
它并不是比面向对象编程更先进的一种独立的编程思想,可以说属于面向对象思想体系的一部分或者说它是面向对象编程体系中的思想精髓之一。
高内聚低耦合,是软件工程中的概念,是判断软件设计好坏的标准,主要用于程序的面向对象的设计,主要看类的内聚性是否高,耦合度是否低。目的是使程序模块的可重用性、移植性大大增强。通常程序结构中各模块的内聚程度越高,模块间的耦合程度就越低。内聚是从功能角度来度量模块内的联系,一个好的内聚模块应当恰好做一件事,它描述的是模块内的功能联系;耦合是软件结构中各模块之间相互连接的一种度量,耦合强弱取决于模块间接口的复杂程度、进入或访问一个模块的点以及通过接口的数据。
如图所示,电灯与电源的这种连接方式就是高内聚、高耦合方式,如果电灯坏了更换的话就需要连电线都要破坏掉,并且要断电才能进行,对系统影响较大。
将上面的电路图修改一下,电源接到插座,电灯接上插头,更换电灯时不用切断电源、破坏线路,只需将新的电灯重新接线即可。
说了那么多理论,我谈一下我对接口粗浅的理解:首先接口是一个标准的签名,比如国标3C认证的三孔插座,它规定了三个孔的位置、大小、尺寸等参数(签名),根据插座的签名规定,制造商制造插头,只要符合插座签名要求的插头都能插在插座上使用。其次接口也可以理解为一种协议,只要符合接口协议的类都能被调用者使用。比如飞利浦的插头坏了,我换一个公牛的插头,只要符合接口协议的都能用,由此可见插座和插头的耦合度是非常低的。
在实际项目中我就遇到这样的情况,系统中使用的led语音卡制造商倒闭了,无法实现控制卡功能的话新项目就要流产。我只能再去找新的控制卡供应商,找到新的控制卡后面临的问题就是,二者功能实现方法天差地别,内部通信协议等等都不相同。尽管两种控制卡有那么多不同但是他们又有相同的,比如最主要的功能是显示文字和播放语音。因此系统需要重新构建。
第一步、把控制卡的主要功能进行抽象,定义控制卡接口(插座)
1 /// <summary> 2 /// led控制卡接口 3 /// </summary> 4 public enterface ICard 5 { 6 public void DisplayText();//显示文字 7 public void PlayVioce();//播放语音 8 }
第二步、创建实现接口的控制卡类(插头)
public class Card1 : ICard { public void Displaytext() { Console.WriteLine("控制卡1显示文字"); } public void PlayVoice() { Console.WriteLine("控制卡1播放声音"); } } public class Card2 : ICard { public void Displaytext() { Console.WriteLine("控制卡2显示文字"); } public void PlayVoice() { Console.WriteLine("控制卡2播放声音"); } }
第三步、创建使用控制卡类,建立插座和插头之间的关系
/// <summary> /// 控制卡使用类 /// </summary> public class UseCard { private readonly ICard _card; /// <summary> /// 构造函数,将ICard接口作为构造函数的参数传递进来 /// </summary> /// <param name="card"></param> public UseCard(ICard card) { _card = card; } /// <summary> /// 控制卡工作方法 /// </summary> public void CardWorking() { _card.Displaytext(); _card.PlayVoice(); } }
第四步、调用
static void Main(string[] args) { var card = new UseCard(new Card1());//构造函数注入 card.CardWorking(); Console.ReadKey(); }

将第一行改为var card=new UseCard(new Card2());后的结果。
通过以上的程序运行结果分析,如果又有新的控制卡需要使用,系统只需要创建新的控制卡类并实现控制卡接口Card3,Card4........,在调用端调用控制卡只需要new一个控制卡类作为参数进行构造函数注入即可,代码量修改量非常小,并且对原有系统没有任何影响。系统的各个类各司其职(满足单一职责)又紧密联系,实现了高内聚低耦合的设计目标。
浙公网安备 33010602011771号