接口委托的好处(300分)

  • 主题发起人 duhai_lee
  • 开始时间
D

duhai_lee

Unregistered / Unconfirmed
GUEST, unregistred user!
接口委托的方式有两种, 抽象类委托和接口委托。 这个我应该没记错吧。 具体怎么委托只记得接口委托的方式了。
目前在项目中碰到一种情况, 现在进行的一个模块可能用到已经完成的模块中的部分功能,例如已完成模块中的核心业务类的某些方法。 这是如果直接调用已完成的单元,可能会出现耦合度高的情况, 把已完成的业务类的部分可共享的方法声明为接口来实现,然后在新模块中,引用声明的接口,这样使用是否能体现委托接口的优势??
不知道大家听明白我的意思了没有。。。
期望大家踊跃发言。
 
帮顶.............
 
用事件也可以做到啊
 
实际上在回答这个问题前,首先要先弄明白什么是接口.
所谓接口 通俗一点说 就是规范,定义 也可以认为是 契约(个人观点) .
实际是很多时候 我们已经 不知不觉的在运用接口的概念
举个简单的例子吧

比如一个 任务调度程序(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(n).canRun() then

task(n).run()
}
当然前面 必须有一段代码加载 具体的任务的代码 建立一个任务数组(当然这里又可以利用其他的一些设计模式来做)
上面 我是利用接口委托来实现,
抽象类委托 跟 接口委托其实不矛盾
如果利用 抽象类委托
那么 就要建立一个 baseTask 这样一个对象
有两个抽象方法
abstract canRun()
abstract run()
其实这两中委托方式 在我这个例子是差不多的.
为了体现他们的区别, 我把上面的例子加一个要求 有些任务 要利用多线程 有些 不能利用多线程 
那么这里就没有办法利用抽象类委托 因为一些语言(例如java)不支持多祖先继承的
只能利用 接口方式.
但这两种 其实也不是完全对立的而是可以集合使用的
比如在这里 我们可以 建一个 Itask 的接口
在建 一个 baseThreadTask(多线程任务) 的抽象类 一个baseTask(不用多线程的)抽象类 
两抽象类 都要实现 itask 接口, 这样就可以利用两种委托方式的比较好的 实现了 这个任务程序。
当前 利用接口委托/抽象类委托的方式 还有其他的一些好处, 这里就没有办法一一的列举出来了 各位可以细细品位其中的美妙之处.

以上是我的一些个人愚见,算是抛砖抛砖引玉吧 希望能和各位同道中人共同探讨.
msn:chshanghai@hotmail.com
 
刚看到 lich 提到 可以利用事件,我想 他的意思大概是利用一些“回调"的机制(接口委托) 或者是利用抽象类委托 的方法来实现. 其实这个只是实现方法的不同
而不是设计模式的不同.
 
[:)]
我也抛砖引玉!
假如Tobj1实现了Iintface1,而TObj2打算同时实现Iintface1和别的接口,这时设计者发现
:TObj2要对Iintface1的实现完全跟Tobj1已经实现的一样,这时只要委托一下就可以了!所以,我觉
得楼主的情况适合用委托。
但是delphi所支持接口委托,带来的好处不是很多。假如Iintface1有100个方法,其中99
个都由Tobj1实现好了,另外一个我需要在TObj2重新实现,我应该怎样做呢?接口的方法可
都是静态的!
大家有什么好办法没有?
 
delphi里的接口委托是这个意思么?是用来做代理的吧?
请楼下的继续。
 
感谢chshanghai深入的分析。
我的设计完成之后,把部分写出来,让大家斧正。
 
做人要厚道, 问题解决为什么还不结贴
 
这个问题解决得真快。

还好我赶在解决前接分了。
 
ok ,先结贴.. chshanhai都抱怨了.
 
多人接受答案了。
 
顶部