1.作为委托去使用。
Java中没有委托,只有接口。所以接口能代替委托的功能。
interface IActionCallback
{
void Callback();
}
约等于委托
Action Callback
为什么是约等于,是因为委托有个特性是可以+=和-=,但是接口只能用=号去赋值。可以认为委托是接口的封装,还有一个List列表去维护需要执行的函数,也就是用类似于观察者模式进行的封装。
class Action
{
List<IActionCallback> invocationList = new List<IActionCallback>();
public void AddListener(IActionCallback callback)
{
invocationList.Add(callback);
}
public void RemoveListener(IActionCallback callback)
{
invocationList.Remove(callback);
}
public void SetListener(IActionCallback callback)
{
invocationList.Clear();
invocationList.Add(callback);
}
public void Invoke()
{
for(int i = 0;i < invocationList.Count;i++)
{
invocationList[i].Callback();
}
}
}
把里面的接口换成函数指针的话,应该就是委托了吧(猜的)。
==============================
2.减少代码耦合
假如有三个类Presenter、View、ViewComponent。对于Presenter和View,这两层都是抽象的,是不区分开发引擎的的。ViewCompnent是针对不同的开发引擎的,比如说Unity,一般就是Monobehaviour。如果是Android,一般就是Activity和Fragment。如果没有接口的存在,那代码就会这样写。
class Presenter
{
View ViewRef;
}
class View
{
Presenter presenterRef;
ViewComponent ViewComponentRef
}
class ViewComponent
{
View ViewRef;
}
如果有接口存在的话,可以直接把View作为一个接口IView,写法就会变成这样。
class Presenter
{
IView viewRef;
}
class ViewComponent : IView
{
Presenter presenterRef
}
Presenter也可以作为接口。
class Presenter : IPresenter
{
IView viewRef;
}
class ViewComponent : IView
{
IPresenter presenterRef;
}
这个应该就是常说的面向接口编程了吧。
====================
3.为对象添加新功能。
因为接口比较NB的地方是可以多继承,而类只能继承一个。所以一个继承了多个接口的对象,就可以认为有多种能力。比如Unity UGUI里面,可以让对象继承IPointerEnterHandler, IPointerExitHandler, IPointerClickHandler,这样这个对象就拥有可以处理Pointer的进入退出和点击事件的能力。由UGUI源码可知,UGUI把所有对象放在ObjectPool里面,然后用is关键字去判断对象上是否有接口,然后添加到接口的列表中,按顺序执行接口中对应的函数。
比方说有个物品,我们让他不仅可以消耗,还可以装备...虽然吃装备感觉怪怪的
interface IConsumable
{
void OnConsume();
}
interface IEquipable
{
void OnEquip();
}
class Item : IConsumable,IEquipable
{
public void OnConsume()
{
}
public void OnEquip()
{
}
}
这样子这个物品就又能装备也能被消耗。
==============================
以上,欢迎讨论