快速学习设计模式-观察者模式

我对设计模式的理解:

多数开发人员应该知道设计模式这个东西;部分人知道23种设计模式;少数人能够熟练使用设计模式,极少数人精通设计模式。

其实23种设模式,其实只是入门,这就相当于你学英语,学会了26个英文字母,才能开始学习单词。同样23种设计模式,只是字母表,想要到精通的层次,要能够灵活的使用设计模式,灵活的组合设计模式。

设计模式是我短期计划中的一部分,我的文章致力于最快最简单的掌握每一个设计模式。

我的设计模式相关的文章,都会在开篇使用一句话,来描述一个设计模式!

 

 该模式设计关键点

 观察者模式,关注的是当一个类状态改变时,其它与之关联的多个类如何捕获到这个变化,并做出一些操作。

 

UML图

 

 大家要逐渐的接受这种面向接口编程的思想。面向接口编程,更容易扩展。简单的解释一下上边的UML图,首先要知道两个概念,一个是主题(topic),一个是订阅者。这两个在设计模式里边代表的是不同的类。主题类的接口一般会有这么几个方法:添加订阅者的方法,移除订阅者的方法,以及当状态改变时,通知订阅者做出对应的动作。

 

代码案例

 

 定义主题类接口,声明添加观察者,删除观察者,以及通知观察者发生变化的三个方法。 这个接口如果不需要扩展,则可以省略。不写也没有问题。

public interface Subject {

    //增加一个观察者
    public void addObserver(Observer observer);

    //删除一个观察者
    public void deleteObserver(Observer observer);

    //通知所有观察者
    public void notifyObserver();

}

主题类实现接口,并实现了被观察者声明的方法。

public class SubjectImpl implament Subject {

    //观察者数组
    private Vector<Observer> oVector = new Vector<>();

    //增加一个观察者
    public void addObserver(Observer observer) {
        this.oVector.add(observer);
    }

    //删除一个观察者
    public void deleteObserver(Observer observer) {
        this.oVector.remove(observer);
    }

    //通知所有观察者
    public void notifyObserver() {
        for(Observer observer : this.oVector) {
            observer.update("敌人来了!!!");
        }
    }

}

 

定义观察者接口,声明了接受变化消息,做出一系列动作的方法。在这里,需要说明一下,这里定义一个接口的意义非常大,因为不同类型的观察者,只需要实现这个定义观察者接口就可以了。

public interface Observer {
    //更新
    public void update(Object changeMess);
}

 

观察者实现类,这个是炮兵类

public class ObserverArtilleryImpl implements Observer {

    @Override
    public void update(Object changeMess) {
        //根据变化的对象做出一些操作
        // do changeMess 
        system.out.print("得到消息" + changeMess)
        
        system.out.print("装弹准备" )
    }

}

 

观察者类,这是一个步兵类

public class ObserverInfantryImpl implements Observer {

    @Override
    public void update(Object changeMess) {
        //根据变化的对象做出一些操作
        // do changeMess 
        system.out.print("得到消息" + changeMess)
        
        system.out.print("步兵注意隐蔽,准备射击" )
    }

}

 

 下边是一个使用的案例:其中被观察者就像是指挥官,而观察者就像是不同的作战部队,观察者等着指挥官发布命令,然后执行命令。

public class Client {

    public static void main(String[] args) {
        //创建一个主题
        Subject subject = new SubjectImpl();
        //定义一个观察者
        Observer observerInfantry = new ObserverInfantryImpl();
         //定义一个观察者
        Observer observerArtillery = new ObserverArtilleryImpl();

        //添加观察者-步兵
        subject.addObserver(observerInfantry );
        //添加观察者-炮兵
        subject.addObserver(observerArtillery);

        // 发布命令,通知所有观察者
        subject.notifyObserver();
    }

}

 

补充

 观察者模式,应该说有两种形式,一种是主动推消息给观察者。一种是被观察者提供数据接口,由观察者来轮询。上边的案例是主动推消息的一种形式。

 这两种模式各有利弊,如果是主动推,可能有时候观察者并不关心变化的数据,从而造成了资源的浪费。而观察者轮询的方式,会有被观察者始终没有变化,观察者又会白白轮询的情况,也是浪费资源。所以使用的时候还是要灵活使用,并不是死板的。

 

个人理解

 观察者模式,也叫做发布订阅者模式。本身放在设计模式里边来说的话,主要是用来描述类与类之间的关系的。关乎到类的动作的,都是行为模式。

 消息队列的设计和观察者模式非常的类似。其实在功能上,也实现了发布与订阅的作用。但是注意它是一种中间件能力。严格意义上不算设计模式。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值