实际上在回答这个问题前,首先要先弄明白什么是接口.
所谓接口 通俗一点说 就是规范,定义 也可以认为是 契约(个人观点) .
实际是很多时候 我们已经 不知不觉的在运用接口的概念
举个简单的例子吧
比如一个 任务调度程序(schedule 调用 (Task1,task2,task n),
一个系统里面有很多任务 ,不同的任务 实现的方式,机制 不一定相同
如果 没有接口 那么只能 针对 task1,task2 写具体的实现
如果以后 要增加 一个Taskm 那么 必须在 schedule 中写
if (条件1 成立)
task1.run1
if (条件2 成立)
task2.run2 ....
....
如果 要增加一个任务 taskm
这时 必须在 schedule 里面 增加
if (条件m 成立)
taskm.runm
如果某个条件 发生了变动,那么又的修改
如果 schedule 和 task 是不同的人写的,那么所有上面这些类似情况如果发现
各位可以自己想想 整个程序的变动.
尤其在多人的协同的情况下,那么 首先就要解决一个问题
大家要统一 比如 如果是任务执行 那么就规定 这个过程名就必须是 run()
在一个 各个任务的触发条件 也必须规定一个 名字 比如 canRun()
等等类似的一些 规范 ,那么这里其实已经应用到了 接口的概念 只是没有明确的指出
那么怎么能保证 以上的 规范能够得到执行, 这时 就可以运用接口来保证
比如
就可以定义一个 任务的接口
interface ITask
有两个方法
canRun()//判断任务触发的条件
run()//具体的任务的执行
有了以上的接口 这时我们会发现 以上的程序可以 省事多了
for (所有的任务) {
if task
.canRun() then
task
.run()
}
当然前面 必须有一段代码加载 具体的任务的代码 建立一个任务数组(当然这里又可以利用其他的一些设计模式来做)
上面 我是利用接口委托来实现,
抽象类委托 跟 接口委托其实不矛盾
如果利用 抽象类委托
那么 就要建立一个 baseTask 这样一个对象
有两个抽象方法
abstract canRun()
abstract run()
其实这两中委托方式 在我这个例子是差不多的.
为了体现他们的区别, 我把上面的例子加一个要求 有些任务 要利用多线程 有些 不能利用多线程
那么这里就没有办法利用抽象类委托 因为一些语言(例如java)不支持多祖先继承的
只能利用 接口方式.
但这两种 其实也不是完全对立的而是可以集合使用的
比如在这里 我们可以 建一个 Itask 的接口
在建 一个 baseThreadTask(多线程任务) 的抽象类 一个baseTask(不用多线程的)抽象类
两抽象类 都要实现 itask 接口, 这样就可以利用两种委托方式的比较好的 实现了 这个任务程序。
当前 利用接口委托/抽象类委托的方式 还有其他的一些好处, 这里就没有办法一一的列举出来了 各位可以细细品位其中的美妙之处.
以上是我的一些个人愚见,算是抛砖抛砖引玉吧 希望能和各位同道中人共同探讨.
msn:chshanghai@hotmail.com