java设计模式-观察者模式

java设计模式-观察者模式,第1张

观察者模式介绍:
观察者模式(有时又被称为发布/订阅模式)是软件设计模式的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。

简单案例:
假设猫是老鼠和狗的观察目标,老鼠和狗是观察者,猫叫老鼠跑,狗也跟着叫,使用观察者模式描述该过程

抽象目标类 MySubject
MySubject是抽象目标类,在其中定义了一个ArrayList类型的集合observers,用于存储观察者对象,并定义了注册方法attach()和注销方法detach() ,同时声明了抽象的通知方法 cry()。需要注意的是attach()方法和detach()方法都必须针对抽象观察者进行编程,任何抽象观察者的子类对象都可以注册或注销。

package com.example.designmode.observeprattern;

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

/**
 * design-mode
 * 

* * @author : ZhangYuJie * @date : 2022-04-24 15:59 **/
public abstract class MySubject { protected List observers = new ArrayList(); /** * 注册方法 * * @param observer */ public void attach(MyObserver observer) { observers.add(observer); } /** * 注销方法 * * @param observer */ public void detach(MyObserver observer) { observers.remove(observer); } /** * 抽象通知方法 */ public abstract void cry(); }

抽象观察者类 MyObserver
抽象观察者MyObserver定义为一个接口,在其中声明了抽象响应方法response()。

package com.example.designmode.observeprattern;

/**
 * design-mode
 * 

* * @author : ZhangYuJie * @date : 2022-04-24 16:02 **/
public interface MyObserver { /** * 抽象响应方法 */ void response(); }

具体目标类 Cat(猫类)
Cat是目标类MySubject 的子类,它实现了抽象方法 cry() ,在cry()中遍历了观察者集合,调用每一个观察者对象的response()响应方法。

package com.example.designmode.observeprattern;

/**
 * design-mode
 * 

* * @author : ZhangYuJie * @date : 2022-04-24 16:05 **/
public class Cat extends MySubject { @Override public void cry() { System.out.println("猫叫!"); System.out.println("-----------------------------------------"); for (Object obs:observers){ ((MyObserver)obs).response(); } } }

具体观察者类 Mouse(老鼠类)
Mouse是具体观察者类,它实现了在抽象观察者中定义的响应方法response()。

package com.example.designmode.observeprattern;

/**
 * design-mode
 * 

* * @author : ZhangYuJie * @date : 2022-04-24 16:05 **/
public class Mouse implements MyObserver { @Override public void response() { System.out.println("老鼠努力逃跑!"); } }

具体观察者类 Dog(狗类)
Dog也是具体观察者类,它实现了在抽象观察者中定义的响应方法response()。

package com.example.designmode.observeprattern;

/**
 * design-mode
 * 

* * @author : ZhangYuJie * @date : 2022-04-24 16:05 **/
public class Dog implements MyObserver { @Override public void response() { System.out.println("狗跟着叫!"); } }

编写客户端类测试
在客户端代码中需要实例化具体目标类和具体观察者类,先调用目标对象的attach()方法来注册观察者,再调用目标对象的cry()方法,在cry()方法的内部将调用观察者对象的响应方法。

package com.example.designmode.observeprattern;

/**
 * design-mode
 * 

* * @author : ZhangYuJie * @date : 2022-04-24 16:17 **/
public class Client { public static void main(String[] args) { MySubject subject=new Cat(); MyObserver obs1,obs2,obs3; obs1=new Mouse(); obs2=new Mouse(); obs3=new Dog(); subject.attach(obs1); subject.attach(obs2); subject.attach(obs3); subject.cry(); } }


观察者模式很好地体现了面向对象设计原则中的开闭原则。

如果需要增加一个观察者,如猪也作为猫的观察者,但是猫叫猪无须有任何反应,只需要增加一个新的具体观察者类,而对原有的类库无须做任何改动,这对于系统的扩展性和灵活性有很大提高。

新增观察者pig类

package com.example.designmode.observeprattern;

/**
 * design-mode
 * 

* * @author : ZhangYuJie * @date : 2022-04-24 16:19 **/
public class Pig implements MyObserver { @Override public void response() { System.out.println("猪没有反应!"); } }

在客户端代码中可以定义一个Pig实例,再将它注册到目标对象的观察者集合中,则需要增加如下代码:

package com.example.designmode.observeprattern;

/**
 * design-mode
 * 

* * @author : ZhangYuJie * @date : 2022-04-24 16:17 **/
public class Client { public static void main(String[] args) { MySubject subject = new Cat(); MyObserver obs1, obs2, obs3, obs4; obs1 = new Mouse(); obs2 = new Mouse(); obs3 = new Dog(); obs4 = new Pig(); subject.attach(obs1); subject.attach(obs2); subject.attach(obs3); subject.attach(obs4); subject.cry(); } }


总结
观察者模式定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/727916.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存