设计模式之行为模式中的观察者模式(observer)

mac2025-08-27  19

设计模式之行为模式中的观察者模式(observer)

声明一、行为模式二、观察者模式三、实例概况描述代码结果优点缺点类似的模式

声明

本人写此文章只是为了梳理知识、更好的学习,基本内容来源于课本《软件架构与模式》,若有错误还请指正,此外会借鉴一些优秀的文章,网址放在文末,若有侵权可告知我删除。

一、行为模式

1、行为模式描述了通过对象间的合作形成的一种关系。 2、行为模式可以区分为基于类的行为模式和基于对象的行为模式。基于类的行为模式通过继承得到所希望的静态行为(如模板方法模式)。基于对象的行为模式可以使用里氏代换原则,在运行时通过提替换对象修改行为(动态修改行为的例子是策略模式)。 3、行为模式研究的是类或对象之间的合作与任务分工,它描述的是对象间的交互。

二、观察者模式

观察者模式允许一个对象把自己状态的变化通知给依赖于它的对象,依赖的对象可以根据收到的时间作出反应并索取更改的数据。通过使用观察者模式,依赖的对象不必使用轮询(控制反转)。

三、实例

概况描述

每个人(Subscribe类)是观察者,在新闻类里定义了向量,有了新的新闻就会通知向量中的成员。

代码

观察者的接口/可观察者的回调接口:

public interface IObserver { public void update(Subject b); }

可观察者(被观察者)的接口:

public interface Subject { public void register(IObserver b); public void cancel(IObserver b); public String getState(); }

观察者类实现接口:

public class Subscribe implements IObserver { private String name; //注意private public Subscribe(String name) { this.name = name; } @Override public void update(Subject b) { System.out.println("new subscribe:" + name); System.out.println("massage:" + b.getState()); } }

被观察者类,一个观察者登记后,就会在表中增加一条记录。观察者注销就会把这条记录从表中删除。这样被观察的对象中就能始终保持实际登记的观察者列表。

import java.util.Vector; public class News implements Subject { private Vector<IObserver> Users = new Vector<IObserver>(); //注意private private String message; //注意private public void notify(String n) { message = n; notifyAllObserver(); } @Override public void register(IObserver b) { Users.add(b); } @Override public void cancel(IObserver b) { Users.remove(b); } private void notifyAllObserver() { for(IObserver b:Users) { b.update(this);//this指什么 } } @Override public String getState() { return message; } }

测试类:

public class Test { public static void main(String[] args) { News n = new News(); Subscribe mike = new Subscribe("Mike"); //定义的是类不是接口 Subscribe john = new Subscribe("John"); n.register(mike); n.register(john); n.notify("news 1"); System.out.println(); n.register(mike); n.notify("news 2"); System.out.println(); n.register(john); n.notify("news 3"); } }

结果

new subscribe:Mike massage:news 1 new subscribe:John massage:news 1

new subscribe:Mike massage:news 2 new subscribe:John massage:news 2 new subscribe:Mike massage:news 2

new subscribe:Mike massage:news 3 new subscribe:John massage:news 3 new subscribe:Mike massage:news 3 new subscribe:John massage:news 3

优点

实现松耦合。 可观察对象在编译时不需要了解观察者,它只需要知道由它确定的接口。 新的观察者可以随时加入。 可观察类从不需要因为观察者而修改。 可观察类和观察者可以互不依赖地复用。 修改可观察类,不修改它的接口,就不会影响观察者。只要观察者遵守回调接口契约,它就可以被任意地修改。

缺点

存在过多的观察者是,可观察对象给观察者发布消息需要消耗过多时间。 在处理信息发布给观察者时,不能发生引起可观察对象状态变化的行为,否则容易导致无限循环。 每一个观察者都会收到可观察对象状态变化的信息,即使它们不需要这些信息。

类似的模式

中间者模式。

最新回复(0)