您的位置:首页 > 移动开发 > Unity3D

[unity3D基础篇05]重要的设计模式 - 观察者模式(Observer) Event/Delegate

2017-05-25 14:56 274 查看
用unity开发一款游戏是很快的。但是如何优化游戏,更好的降低代码中类对象之间的耦合性却并不是那么容易。主要是涉及了程序设计方面的很多问题。

下面记录下在设计过程中经常使用的模式,观察者模式(事件/委托机制)

文章参考:http://www.cnblogs.com/wangjq/archive/2012/07/12/2587966.html

首先还是先来说一下观察者模式。

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

“委托”(Delegate)。简单的来说就是你委托别人帮你做一件事情,当委托人做完你委托的事情之后会告诉你他做完了。

观察者模式类图:



模式中的角色

  1 抽象主题(Subject):它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。

  2 具体主题(ConcreteSubject):将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。

  3 抽象观察者(Observer):为所有的具体观察者定义一个接口,在得到主题通知时更新自己。

  4 具体观察者(ConcreteObserver):实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。

举个简单的例子:比如在玩Dota2或者LOL的时候和对方互砍。这个动作就是具体的主题。监听这个动作的比如有:系统的UI(HP,MP血条。互砍减血时血条相应的变化),游戏的死亡控制(砍到一方死的时候播放死亡动画,声音,增减金币,死的一方送入泉水画面变灰等等)

但是这个模式又有很多不足的地方:

依赖关系并未完全解除,抽象通知者依旧依赖抽象的观察者。

Unity3d (C#)中有个很好的方式来实现,就是委托机制。委托可以看作是对函数(方法)的的抽象,是函数的“类”,委托的实例代表一个(或多个)具体的函数,它可以是多播的。

 关于事件:事件基于委托,为委托提供了一种发布/订阅机制。事件的订阅与取消与我们刚才讲的观察者模式中的订阅与取消类似,只是表现形式有所不同。在观察者模式中,订阅使用方法Attach()来进行;在事件的订阅中使用“+=”。类似地,取消订阅在观察者模式中用Dettach(),而事件的取消用。

下面例子分别用观察者模式,事件机制来实现

观察者模式的实现:(具体的代码:http://www.cnblogs.com/wangjq/archive/2012/07/12/2587966.html



事件实现



 publicdelegate
void CustomerEventHandler();
///<summary>

    /// 具体主题///
</summary>

 public class Customer : ISubject {

       
private string customerState;
// 声明一个委托事件,类型为 CustomerEventHandler

        public event CustomerEventHandler Update;

publicvoid Notify() {

           if (Update !=
null) { // 使用事件来通知给订阅者
                 Update();

            }

        }

publicstring CustomerState {

           get {
return customerState; }

           set { customerState = value; } }

    }

            // 注册事件

            subject.Update += accountant.GiveInvoice;

            subject.Update += cashier.Recoded;

            subject.Update += dilliveryman.Dilliver;

对于以上两种模式我的理解是:

观察者模式

好比财务员,出纳员和配送员给客户预留了电话号码。客户支付完成后分别给这些预留号码的人电话通知,告诉他们支付已完毕。然后这些人相应的完成这个客户(主题对象的引用)的不同需求。

事件机制

好比客户找了一个中介(delegate), 中介给客户留了电话号码。财务员,出纳和配送人员授权这个中介。中介在接到客户完成支付的电话后代理完成被授予的对应这个客户的以上的需求。



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息