设计模式(4)——观察者模式(续)

简单工厂模式和工厂模式是用来实例化类的一种设计模式,工厂模式相比简单工厂模式实现了所有要实例化类的抽象,并根据该抽象类的子类来实现各个类的实例化对象,该方式充分体现了依赖倒置原则,充分体现了针对接口编程而不是针对实现编程的原理……

代理模式是一种十分好理解的设计模式,首先是有一个抽象的功能类,包含了所有要实现的方法或者属性,然后真实实体和代理(Proxy)分别去继承并实现方法,然而在代理中,保存了对真实实体的引用,实现的方法是真实实体的方法,当你调用代理的时候,就相当于调用了真实实体的方法,由于代理在访问对象时引入了一定程度的间接性,就是因为这种间接性可以附加各种用途……

抽象类与接口的区别:抽象类是对一系列事物的概括抽象,就像动物与狗猫鼠等,然而接口是对一系列功能的抽象,就像动物接口功能是吃,跑等等,所以继承自类只能继承一个,因为是动物就不能是植物,然而实现接口或者说继承接口就可以多个,因为部分植物接口的功能,例如新陈代谢,生长等……

好的,扯多了,回到观察者模式上来。综合这些天看的相关代码,我认为观察模式目前主要可以通过两种形式实现,经典的实现方式是接口(或者抽象类),通过实现抽象主题和抽象观察者,但是要在抽象主题中保持对抽象观察者的引用,在抽象主题中包含添加观察者,移除观察者,广播观察者三个方法,而且由于是继承自抽象观察者,所以方法名都相同,这样也不符合实际情况……

怎么样做到进一步解耦呢,也就是说让主题与观察者可以互相不知道,主题不再需要保存对观察者的引用,而且观察者可以各有各的执行方法名,接下来,就由我们的委托与事件出场了。

更改博文《设计模式(2)——观察者模式》中的关于委托的例子,那个例子写的啰嗦了,既然是委托,那么就可以实现解耦了。

    public delegate void ObserverMethod();
    public class Subject//主题,发布者
    {
        public ObserverMethod observerMethod;
        public void Notify()//通知所有订阅者
        {
            observerMethod();
        }
    }
    public class Observer1//订阅者1,观察者
    {
        public void method1()
        {
            Console.WriteLine("I get your news!");
        }
    }
    public class Observer2//订阅者2,观察者
    {
        public void method2()
        {
            Console.WriteLine("I get your news !");
        }
    }
    public class Program
    {
        public static void Main()
        {
            Subject subject = new Subject();
            Observer1 observer1 = new Observer1();
            Observer2 observer2 = new Observer2();
            subject.observerMethod = observer1.method1;
            subject.observerMethod += observer2.method2;
            subject.Notify();
            Console.Read();
        }
    }

这样看着太简洁了,似乎还有点不习惯……利用委托充分解耦,主题和观察者可以互不知道,主题说:反正我一根绳子在这里,谁接着这根绳子我就通知谁,具体谁接着,我才不管。

用事件可以更好的完成,因为事件可以传递参数,而且更为安全……近期将着重讨论委托与事件的具体区别与联系,会继续补充后续内容。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值