设计模式之观察者模式与事件委托

简介:

        观察者模式:

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

          观察者结构模式图:

            

          结合例子:

 static void Main(string[] args)
        {
            //老板dandan
            Boss dandan=new Boss ();
            //看股票的同事
            StockObserver hongjie=new StockObserver ("张三",dandan );

            dandan.Attach (hongjie );
            //老板回来
            dandan .SubjectState="丹丹回来了";
             //发出通知
             dandan.Notify ();

        }
        //通知者接口
        interface Subject
        {
            void Attach(Observer observer);
            void Detach(Observer observer);
            void Notify();
            string SubjectState
            {
                get;
                set;
            }
        }
        //具体通知者类
        class Boss:Subject
        {
            //同事列表
            private IList<Observer > observers=new List<Observer>();
            private string action;
            //增加
            public void Attach(Observer observer)
            {
                observers.Add (observer );
            }
            //减少
            public void Detach(Observer observer)
            {
                observers.Remove (observer );
            }
            //通知
            public void Notify()
            {
                foreach (Observer o in observers )
                    o.Update ();
            }
            //老板状态
            public string SubjectState
            {
                get {return action ;}
                set {action =value ;}
            }
        }
        //抽象观察者
        abstract class Observer
        {
            protected string name;
            protected Subject sub;

            public Observer (string name,Subject sub)
            {
                this.name =name ;
                this.sub =sub ;
            }

            public abstract void Update();

        }
        class StockObserver:Observer 
        {
            public StockObserver (string name,Subject sub):base(name,sub )
            {
            }
            public override void Update()
            {
 	            Console .WriteLine ("{0}{1}关闭股票行情,继续工作!",sub.SubjectState ,name );
            }
        }
              这里用到了一个接口Subject和一个抽象类Observer,这两个抽象类的使用体现了面向对象的思想,减少了观察者与被观察者之间的耦合度,如果我们直接写出公司中的boss(被观察者)和observer(观察者),那么他们之间必然会有紧密的联系,如果被观察者改变或增加,不管被观察者类会受到影响,由于被观察者与观察者之间的紧耦合,则,观察者也必然会做相应修改,这不符合依赖倒转原则和开闭原则。因此,我们需要用观察者模式,一方面,观察者模式具有一个对象的改变可以同时改变其他所有对象;另一方面,观察者模式运用接口和抽象类,降低了耦合度,符合设计原则,增强了程序的可维护、扩展和重用性。

           但这一设计模式仍然有其缺点,因为这种模式的一个特点是抽象通知类还是依赖抽象观察类的,如果没有抽象观察类,那么通知就无法实现,所以为了避免这一不足,我们就用到了委托事件。

          事件委托与观察者模式:

                 在之前的博客中,我已经讲到了委托,何谓委托?简单的说委托可以看做是对函数的抽象,是函数的类,委托的实例将代表一个实例,一旦为委托分配了方法,委托将与该方法具有完全相同的行为。在没有抽像观察类的情况下,我们可以通过使用事件委托,将同一通知发给所有通知者,即时没有接口,这一功能同样可以实现,而且降低了与抽象通知类之间的依赖关系,增加了扩展性、灵活性。

          观察者模式的几个要点:

                      1、使用面向对象的抽象,观察者模式使得我们可以独立改变目标与观察者,从而使得两者之间的依赖关系达到松耦合

                      2、目标发送通知时,无需指定观察者,通知会自动传播。观察者自己决定是否需要订阅通知,目标对象对此一无所知。

                      3、委托充当了抽象的观察者接口,而提供事件的对象充当饿了目标对象。委托是比抽象观察者接口更为松耦合的设计。


相关文章
|
4月前
|
设计模式 PHP
php设计模式--观察者模式(4.1)面向过程完成页面内容切换
php设计模式--观察者模式(4.1)面向过程完成页面内容切换
30 0
|
7天前
|
设计模式 Java 关系型数据库
设计模式——观察者模式
观察者模式介绍、观察者模式优化天气预报案例、JDK 的Observable类和Observer类
设计模式——观察者模式
|
4月前
|
设计模式 监控 Java
设计模式 - 观察者模式(Observer):Java中的战术与策略
【4月更文挑战第7天】观察者模式是构建可维护、可扩展系统的关键,它在Java中通过`Observable`和`Observer`实现对象间一对多的依赖关系,常用于事件处理、数据绑定和同步。该模式支持事件驱动架构、数据同步和实时系统,但需注意避免循环依赖、控制通知粒度,并关注性能和内存泄漏问题。通过明确角色、使用抽象和管理观察者注册,可最大化其效果。
99 2
|
1月前
|
设计模式 存储 前端开发
【十四】设计模式~~~行为型模式~~~观察者模式(Java)
文章详细介绍了观察者模式(Observer Pattern),这是一种对象行为型模式,用于建立对象之间的一对多依赖关系。当一个对象状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。文中通过交通信号灯与汽车的案例以及多人联机对战游戏的设计方案,阐述了观察者模式的动机和应用场景。接着,文章介绍了观察者模式的结构、角色、优点、缺点以及适用情况,并通过代码示例展示了如何在Java中实现观察者模式。此外,还探讨了观察者模式在MVC架构中的应用以及Java中对观察者模式的支持。
【十四】设计模式~~~行为型模式~~~观察者模式(Java)
|
1月前
|
设计模式 安全 Go
[设计模式]行为型模式-观察者模式
[设计模式]行为型模式-观察者模式
|
1月前
|
设计模式 Go
go 设计模式之观察者模式
go 设计模式之观察者模式
|
2月前
|
设计模式 安全 Java
Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
60 1
|
2月前
|
设计模式 缓存
iLogtail设计模式问题之观察者模式在iLogtail中是如何应用的
iLogtail设计模式问题之观察者模式在iLogtail中是如何应用的
|
3月前
|
设计模式 消息中间件 存储
跟着GPT学设计模式之观察者模式
观察者模式是一种行为型设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象的状态发生改变时,其依赖对象都能够收到通知并自动更新。一般情况下,被依赖的对象叫作被观察者(Observable),依赖的对象叫作观察者(Observer)。
26 1
|
3月前
|
设计模式 存储 Java
Java设计模式之观察者模式详解
Java设计模式之观察者模式详解