设计模式之观察者模式

设计模式之观察者模式

观察者(Observer)关心被观察者(Subject)的某个状态(subjectState),一旦状态变化,观察者就能收到通知(Notify),并更新自己的状态(observerState)。

动机:在软件构建 过程中,我们需要为某些对象建立一种“通知依赖关系” 一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。使用面 向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。
意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。
与其他模式关系:
与访问模式有类似的地方,但访问者模式是双向依赖,二维变化。而观察者是单向的。

观察者模式通常是一对多的关系,但我为了体现该模式的重点(即:被观察者一旦变化,观察者能自动的适应变化,把这种依赖固话,用以弱化这种依赖关系)

下面代码演示一下:

Observer:

public interface Observer {
    //数据接收
    void dataChange(String messege);
}

Subject:

public abstract class Subject {

   protected List<Observer> list = new ArrayList<Observer>();

   //add方法
    public void add(Observer o){
        list.add(o);
    }

    //remove方法
    public void remove(Observer o){
        list.remove(o);
    }

    //通知的抽象方法
    public abstract void notifyObserver(String messege);
}

ConcreteSubject:

public class ConcreteSubject extends Subject {

    private static Logger log = Logger.getLogger(ConcreteSubject.class);

    @Override
    public void notifyObserver(String messege) {
        for (Observer o : list) {
            log.info("notify ovserver " + messege + "change.....");
            o.dataChange(messege);
        }
    }
}

ConcreteObserver:

public class ConcreteObserver implements Observer {
    private static Logger log = Logger.getLogger(ConcreteObserver.class);

    @Override
    public void dataChange(String messege) {
        log.info("recive message : " + messege);
    }
}

Test:

public class Test {
    public static void main(String[] args) {

        Subject subject = new ConcreteSubject();
        Observer o = new ConcreteObserver();
        subject.add(o);
        subject.notifyObserver("好困啊..........");
    }
}

这种发布订阅有种redis的感觉

输出:

六月 11, 2020 12:25:49 上午 [com.xiao.demo08.ConcreteSubject]  UNKNOWN METHOD
信息: notify ovserver 好困啊..........change.....
六月 11, 2020 12:25:49 上午 [com.xiao.demo08.ConcreteObserver]  notifyObserver
信息: recive message : 好困啊..........

喜欢的小伙伴,也可以关注我的公众号,里面会每天分享java的干货哈
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

计算机毕业设计,

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值