Java设计模式之--观察者模式

观察者模式属于行为型模式的一种,该模式一般用来描述对象之间的依赖关系

行为型模式:关注对象间的交互,研究对象间的相互作用,明确每一个对象职责。

观察者模式定义:定义对象之间的一种一对多的依赖关系,当一个对象状态发生改变时,其相关依赖的对象将被通知并自动更新。生活中比如股票的涨跌会影响股民的情绪的变化。
(一个对象变化时其依赖的对象会自动变化更新)
(类似于监听器)
如mvc模式就是用了观察者模式,观察者为View视图层,被观察对象为Model模型层,当Model变化时View会根据变化自 动更新数据

观察者模式主要解决问题:一方的状态发生了变化,依赖于这一方的观察者立即能收到通知。
如:例如我们平时订阅的微信公众号,一旦公众号有新的文章发布,订阅者能够立即收到新的文章推送。
这里需要注意的是,目标对象会把状态的变化通知所有观察者,而不管观察者的具体身份。自己也并不知道通知的这个人究竟是谁。

模式结构
在这里插入图片描述
(1)Subject(目标类):定义观察者集合。提供接口增加或删除观察者对象,定义通知方法。
(2)ConcreteSubject(具体目标):目标类子类,负责向各个观察者通知。
(3)Observer(观察者类):对所观察的目标的改变做出反应。
(4)ConcreteObserver(具体观察者):实现更新数据的方法。

举例:股民的反应根据股票的上涨和下跌做出不同反应,上涨时股民开心,下跌时股民伤心,
本例中股票为被观察者为目标类,股民为观察者,对股票变化反应

1、目标类(股票)

package com.mypachgong.See;

import java.util.ArrayList;
import java.util.List;

/**
 * 股票上涨,股民开心,股票下跌股民伤心
 * 股票情况为目标类
 * 股民为观察者
 **/

//subject目标类,观察者观察的对象(抽象类)
//定义观察者集合。提供接口增加或删除观察者对象,定义通知方法。
//一般我们会在在目标中定义一个观察者集合,用来管理观察者。
//一个观察目标可以接受任意数量的观察者来观察,它提供一系列方法来增加和删除观察者对象,
// 如attach()方法与detach()方法;同时也会定义通知方法notify()。
public abstract class Subject {

    //定义一个观察者集合,用于管理观察者
    protected List<Observer> observers = new ArrayList<>();


    //向观察者集合中增加一个观察者对象
    public void attach(Observer observer){
        observers.add( observer );
    }
    //向观察者中删除一个观察者对象
    public void delattach(Observer observer){
        observers.remove( observer );
    }
    //抽象通知方法(股票上涨)
    public abstract void increase();
    //抽像通知方法(股票下跌)
    public abstract void decrease();

}

2、具体目标

package com.mypachgong.See;


//具体目标对象,某一之股票,长江证券股票
//具体目标是目标类的子类(接口的实现者),通常它包含有经常发生改变的数据,
// 当它的状态发生改变时,向它的各个观察者发出通知;
// 同时它还实现了在目标类中定义的抽象业务逻辑方法
public class changjiangzehngquan extends Subject {
    @Override
    public void increase() {
        System.out.println( "股票上涨了" );
        //遍历观察者集合,调用每个观察者的响应方法
        for (Observer o : observers) {//子类继承父类的对象observers
            o.happy();//目标对象发生变化,调用观察者的方法更新数据
        }
    }

    @Override
    public void decrease() {
        System.out.println( "股票下跌了" );
        for (Observer o : observers) {
            o.terrible();
        }
    }


}

3、观察者类(股民)

package com.mypachgong.See;


//观察者(接口)
//对所观察的目标的改变做出反应。
//观察者角色一般是一个接口,它会有一个update方法,
// 当目标对象的状态发生改变时,这个方法就会被调用。
public interface Observer {
     public void happy();
     public void terrible();
}

4、具体观察者

package com.mypachgong.See;

public class Gupiao implements Observer {

    @Override
    public void happy() {
        System.out.println("股民开心");
    }

    @Override
    public void terrible() {
        System.out.println("股民难受");
    }
}

5、测试类

package com.mypachgong.See;

//测试类
public class Test {
    public static void main(String[] args) {
        Subject s=new changjiangzehngquan();
        s.attach( new Gupiao() );
        s.increase();
        s.decrease();

    }
}

输出结果
在这里插入图片描述

应用场景举例:
1、当买票支付后,买票人收到短信。
2、微博订阅,当关注某人微博后,该博主发布的消息会向所有观察者(关注者推送)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值