Java设计模式之观察者模式(Observer模式)

网友投稿 203 2023-01-18

Java设计模式之观察者模式(Observer模式)

一、观察者模式是什么?

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。

二、模式分析

2.1 四个角色

抽象主题(抽象被观察者角色):也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。

抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。

具体主题(具体被观察者角色):也就是一个具体的主题,在集体主题的内部状态改变时,所有登记过的观察者发出通知。

具体观察者角色:实现抽象观察者角色所需要的更新接口,一边使本身的状态与制图的状态相协调。

2.2 案例

1.抽象主题

public interface Subject {

/**

* 注册观察者

*/

void registerObserver(observer observer);

/**

* 移除观察者

*/

void removeObserver(observer observer);

/**

* 通知观察者

*/

void notifyObservers();

}

2.抽象观察者角色

public interface observer {

/**

* 更新

*/

void update(String message);

}

3.具体主题

用Vector是线程同步的,比较安全,也可以使用ArrayList,是线程异步的,但不安全。

public class WechatServer implements Subject{

//注意到这个List集合的泛型参数为Observer接口,设计原则:面向接口编程而不是面向实现编程

private Vector list;

private String message;

public WechatServer() {

list = new Vector();

}

@Override

public void registerObserver(observer observer) {

list.add(observer);

}

@Override

public void removeObserver(observer observer) {

if(!list.isEmpty())

list.remove(observer);

}

@Override

public void notifyObservers() {

for(int i = 0; i < list.size(); i++) {

observer oserver = list.get(i);

oserver.update(message);

}

}

public void setInfomation(String s) {

this.message = s;

System.out.println("微信服务更新消息: " + s);

//消息更新,通知所有观察者

notifyObservers();

}

}

4.具体观察者角色

public class User implements observer {

private String name;

private String message;

public User(String name) {

this.name = name;

}

@Override

public void update(String message) {

this.message = message;

read();

}

public void read() {

System.out.println(name + " 收到推送消息: " + message);

}

}

5.测试类

public clabGTtlhppSass Test {

public static void main(String[] args) {

//主题

WechatServer server = new WechatServer();

//观察者

observer userZhang = new User("ZhangSan");

observer userLi = new User("LiSi");

observer userWang = new User("WangWu");

server.registerObserver(userZhang);

server.setInfomation("C是世界上最好用的语言!");

System.out.println("====================================");

server.registerObserver(userLi);

server.registerObserver(userWang);

server.setInfomation("java是世界上最好用的语言!");

}

}

6.结果

三、观察者模式的优缺点

优点

解除耦合,让耦合的双方都依赖于抽象,从而使得各自的变换都不会影响另一边的变换。

缺点

在应用观察者模式时需要考虑一下开发效率和运行效率的问题,程序中包括一个被观察者、多个观察者,开发、调试等内容会比较复杂,而且在Java中消息的通知一般是顺序执行,那么一个观察者卡顿,会影响整体的执行效率,在这种情况下,一般会采用异步实现。

四、总结

当一个对象的改变需要同时改变其它对象,并且它不知道具体有多少对象有待改变的时候,应该考虑使用观察者模式。 而使用观察者模式的动机在于:将一个系统分割成一系列相互协作的类有一个很不好的副作用,就是需要维护相关对象间的一致性,我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便,而观察者模式所做的工作就是在解除耦合。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:如何找到免费api(如何找到免费的麻将游戏)
下一篇:Java基础之重载(Overload)与重写(Override)详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~