博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用一个常见的生活小例子来解释和演示面向接口编程
阅读量:4328 次
发布时间:2019-06-06

本文共 2536 字,大约阅读时间需要 8 分钟。

最近一直在研究这个,无奈脑袋空洞理解不能。今天盯着一张“电脑和很多外接设备的图”看了很久,突然灵机一动,利用从其他博客里了解的知识来进行总结和练习,终于明白一点面向接口编程是什么了。并且感叹,能将生活案例抽象到代码里来实现,想象力和脑洞真TM牛逼。

1)从一个生活例子来解释面向接口编程

一台笔记本电脑从厂家生产好后,这台设备就不能被随意撬开并修改里面的零件,这解释了“开放-封闭原则”的“对修改关闭”。但这台电脑必须要能插鼠标、接外置键盘、插散热器……因此厂家在电脑外部弄了几个USB插槽,这相当于在告诉外界“你想要插鼠标,就去买一个能插这USB接口的鼠标”,因此鼠标厂商也必须针对这个USB接口规范,去设计出能插这个USB接口的鼠标。这也是其他博文里常见对接口概念的解释:“接口是定义一种规范,表示如果你要实现接口,就必须做到XXXX”。这也解释了“开放-封闭原则”的“对扩展开放”。这样这台电脑从出厂之后,内部就一直没被撬开修改过,而对外却又可以满足任何可以插USB接口的外接设备。这是生活中最常见也是最安稳的行为。而平时编程的习惯,用生活例子来解释则更加像是“工厂生产了一台电脑,没有USB接口,用户要对电脑扩展一个鼠标使用,就必须撬开电脑并把鼠标线路和主板线路复杂地连在一起才能使用。之后要对电脑扩展一个键盘使用,就还要再撬开电脑一次”,想想就觉得害怕。因此强调“开放-封闭原则”,有些东西不能随意改变,但又能完美扩展。

2)从一个代码例子来演示面向接口编程

先理解透上面的例子,这样才好继续用代码来解释。在编写代码过程中要联系到上面的生活例子,理解厂家从生产电脑到用户使用电脑,关心的各是什么。接下来用C#代码演示:

1.新建一个接口IUSBable,该接口证明了“不管你要插什么外界设备,都必须能和这个USB接口吻合”,在程序里意思就是“你要使用接口,就必须实现接口”。代码如下,

public interface IUSBable    {        void Connect();    }

2.新建一个电脑类Computer.cs,然后把上面那个IUSBable接口组装到电脑上,这样电脑就具有了这个接口的功能。如果不给电脑组装接口,那用户要插鼠标就要撬开电脑,岂不是罪过。代码如下,

public class Computer    {        public void Connect(IUSBable i)        {            i.Connect();//这里能调用Connect()方法的对象,肯定都实现了这个接口。就像能连接电脑的,都有一个能插USB接口的插头        }    }

3.上面已经生产好了一台完整的电脑,这时候电脑从厂商卖给客户了。先新建一个实现了IUSBable接口的鼠标类Mouse.cs,这是鼠标厂商必须做的事情。代码如下,

public class Mouse : IUSBable    {        public void Connect()        {            Console.WriteLine("鼠标连上去了");        }    }

4.主函数代码实现,客户买来鼠标,又有了电脑。只要把鼠标插上去就可以了。代码如下,

static void Main(string[] args)        {            Computer pc = new Computer();            pc.Connect(new Mouse());//插入鼠标            Console.ReadKey();        }

5.如果要插键盘了,参考第3步,写一个键盘类KeyBoard.cs,实现接口的方法。并在主函数里加一句pc.Connect(new KeyBoard());,这样电脑也完成了连接。

3)总结

1.设计模式让人头大可能有这么一个原因:分不清代码和角色的职责。就上面代码来说,厂商生产电脑就是做第1步和第2步。因此需要修改IUSBable接口或computer类的代码时,肯定也是厂商修改,电脑出问题了当然要找商家修理是吧。在公司里要修改这两个地方的代码,肯定也是一些主管或者老大。通常也是老大写好这两个地方后,交给实习生和程序员用于之后扩展功能使用。

2.要拔掉鼠标,那就删掉pc.Connect(new Mouse());,这不影响电脑类和鼠标类内部的代码。也正好对应生活的常识:用户拔插鼠标丝毫不影响鼠标和电脑内部零件。

3.设计模式、代码规范跟生活都息息相关,灵活运用生活的例子来理解设计模式可能更好。

4.面向接口编程时Computer类内部如何设计实际上写法有很多种,但重要的是“给Computer类提供一个对外开放的接口”,理解这个概念最重要。本文代码示例参照了该链接:http://blog.csdn.net/nvd11/article/details/42305895,当然这篇百度文库的图文解释里第25页的设计也很不错:https://wenku.baidu.com/view/dcc313ebb4daa58da1114aa1.html

5.如果违背“开放-封闭原则”,如果没有接口的话,就只有“撬开电脑连鼠标”。上面代码如果不用接口来做,那么之后增加一个鼠标类,又增加一个键盘类,还要在Computer.cs中增加一个重载的方法来完成设备与电脑的连接,这就是“撬开电脑插设备”。代码如下,

public class Computer    {        public void Connect(Mouse m)        {            m.Connect();        }        public void Connect(Keyboard k)        {            k.Connect();        }    }

转载于:https://www.cnblogs.com/tthjHiroki/p/8309509.html

你可能感兴趣的文章
[Leetcode]leetcode1-10题随记
查看>>
HDU 4162 Shape Number
查看>>
HDU 5211 Mutiple 水题
查看>>
linux中ctrl+z、ctrl+d和ctrl+c的区别
查看>>
mysql数据库的简单操作
查看>>
走过2013,走进2014
查看>>
修改tomcatlog输出等级
查看>>
数据结构 堆栈
查看>>
微信公众号开发C#系列-6、消息管理-普通消息接受处理
查看>>
RDIFramework.NET V2.9版本 WinFom部分新增与修正的功能
查看>>
AOP实战
查看>>
最大堆,最小堆及堆排序
查看>>
学习日记
查看>>
EasyNVR RTSP转RTMP-HLS流媒体服务器前端构建之:内部搜索功能的实现
查看>>
四则运算--封装5.1
查看>>
Python中dunder名称的来历
查看>>
不知道下一步该怎么走
查看>>
并查集,合根植物
查看>>
C++中String类的字符串分割实现
查看>>
HelloWorld
查看>>