设计模式之观察者模式

模式的动机

在很多情况下,对象并不是孤立存在的,如股票的变动,倘若某支股票上涨,则应该让购买该股票的股民得到通知,并为之欣喜,否则就会失望悲伤,甚至演化出种种的事故…
从例子中我们不难可以分离出两类角色,一类我们称之为观察者,如股民,另一类就是被这些观察者观察的对象,如股票等;如果观察目标有某个动作发生。观察者就会相应,就像小时候的捉迷藏,躲着的我们在观察是否有人来抓你,有的话就会一下子四散逃跑,那个抓的人就是被观察者;
同样的在设计模式中,与之对应的是就是观察者模型;话不多说,接下来我们看看它的模式结构到底是怎样的,见下面哦!

模式结构

观察者模式结构图

观察者模式包含以下角色

1.Subject

被观察的对象,也成为目标对象
在里面提前定义了一个List Observers集合,用来保存实现了Observer接口的各种具体的观察者,这里是能够通知到观察者的重要之点!

2.ConcreteSubject

具体的被观察的对象,继承抽象类Subject
上面可以一个抽象类,而不是真正的被观察对象,不要混淆哦,多了个抽象类实际上是为了满足ocp和里氏代换原则(不懂这两个原则的自行百度),该具体类实现了向list中保存的各个观察者发出通知,同时也实现了目标类中定义的抽象逻辑方法(如果有的话)

3.Obsever

抽象观察者
将具体观察者对象抽取出来形成的接口,该接口声明了响应的方法response()

4.ConcreteObserver

具体观察者类
实现了response()方法

模式分析

这一模式中关键对象是观察目标和观察者,一个目标可以拥有多个与之依赖的观察者(其实就是将具体的观察者存入到List Observers里面),一旦目标对象状态发生变化,所有的观察者都将得到通知(也就是执行notify()方法)。作为对整个通知的响应,每个观察者做出各自的回应(也就是调用自身的response()方法),以达到与状态目标一致的状态,这种交互模式也成为发布-订阅模式(之后将模拟一个微信公众号进行验证,敬请期待),观察者模式定义了一种一对对的依赖关系,下面将举例验证该模式

举例验证

某在线股票软件需要提供如下功能:当股票购买者所购买的某支股票价格变化幅度达到5%时,系统将自动发送通知(包括新价格)给购买该股票的股民。现使用观察者模式设计该系统

//被观察者,也就是抽象目标对象

public abstract class Shares {

    protected ArrayList<SharesPeople> people = new ArrayList<SharesPeople>();

    public void attach(SharesPeople sharespeople){
        people.add(sharespeople);
    }

    public void remove(SharesPeople sharespeople){
        people.remove(sharespeople);
    }

    public abstract void notifyPeople(int num);

}
//具体的目标对象,具体的被观察对象
public class SharesEvent extends Shares{

    @Override
    public void notifyPeople(int num) {
        // TODO Auto-generated method stub
        if(num>=5){
            for(Object obj:people){
                System.out.print("***股票变化:");
                ((SharesPeople)obj).response();
            }
        }else{
            System.out.print("股票变化:");
            System.out.println("正常..");
        }
    }


}
//观察者统一接口
public interface SharesListener {
    void response();
}
//具体观察者
public class SharesPeople implements SharesListener{

    private String name;
    public SharesPeople(String name){
        this.name = name;
    }

    @Override
    public void response() {
        // TODO Auto-generated method stub
        System.out.println("正在发送通知股民成员:"+name+"。内容为:股票价格变化幅度达到5%..");
        System.out.println("***"+name+"已收到通知");
    }

}

客户端进行调用

public class client {

    @Test
    public void test(){
        Shares shares = new SharesEvent();

        SharesPeople people1 = new SharesPeople("郑老师");
        SharesPeople people2 = new SharesPeople("刘老师");
        SharesPeople people3 = new SharesPeople("徐老师");

        shares.attach(people1);
        shares.attach(people2);
        shares.attach(people3);

        shares.notifyPeople(1);
        shares.notifyPeople(2);
        shares.notifyPeople(5);

    }
}

运行结果为:

运行结果

作者:KD_Y
博客:http://blog.csdn.net/weixin_36708538/article/details/78725617(转载请说明出处)
扫码关注我微信,聊点不一样的设计模式

微信

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
观察者模式是一种常用的设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象状态发生变化时,它的所有观察者都会收到通知并更新自己的状态。 在C++中,观察者模式通常由一个抽象主题类和多个具体观察者类组成。抽象主题类中定义了添加、删除和通知观察者的接口,具体观察者类实现了更新自身状态的方法。 以下是一个简单的观察者模式示例: ```c++ #include <iostream> #include <vector> class Observer { public: virtual void update() = 0; }; class Subject { public: void attach(Observer* observer) { observers.push_back(observer); } void detach(Observer* observer) { for (auto it = observers.begin(); it != observers.end(); ++it) { if (*it == observer) { observers.erase(it); break; } } } void notify() { for (auto observer : observers) { observer->update(); } } private: std::vector<Observer*> observers; }; class ConcreteObserver1 : public Observer { public: void update() override { std::cout << "ConcreteObserver1 updated" << std::endl; } }; class ConcreteObserver2 : public Observer { public: void update() override { std::cout << "ConcreteObserver2 updated" << std::endl; } }; int main() { Subject subject; ConcreteObserver1 observer1; ConcreteObserver2 observer2; subject.attach(&observer1); subject.attach(&observer2); subject.notify(); subject.detach(&observer1); subject.notify(); return 0; } ``` 在上面的示例中,Subject类是抽象主题类,Observer类是抽象观察者类,ConcreteObserver1和ConcreteObserver2是具体观察者类。当Subject对象状态发生变化时,它会通知所有观察者更新自己的状态。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值