Java观察者模式 : Observer / Observable

简介: /**Java观察者模式的场景:一个女孩洗澡,被很多男孩偷看。女孩洞察后,搜索坏男孩,然后继续洗澡。三个类:Boy,Girl还有主类MainClass。
/**
Java观察者模式的场景:一个女孩洗澡,被很多男孩偷看。
女孩洞察后,搜索坏男孩,然后继续洗澡。

三个类:Boy,Girl还有主类MainClass。
*/

/*
男孩
Boy.java
*/
import java.util.Observable;
import java.util.Observer;


public class Boy implements Observer{
 
 private String name="";
 
 public Boy(String name){
  this.name=name;
 }
 
 @Override
 public void update(Observable o, Object obj) {
  
  Girl girl=(Girl)o;
  
  System.out.println(name+" 看到 "+girl.getName()+" "+girl.getStatus());
 }
 
 
 public String getName()
 {
  return name;
 }
}

 

 


/*
女孩
Girl.java
*/
import java.util.Observable;


public class Girl extends Observable{
 private String name="";
 private String thing="";
 
 public Girl(String name){
  this.name=name;
 }
 
 public void doSomething(String thing){
  this.thing=thing;
  
  this.setChanged();  
  this.notifyObservers(thing); 
 }
 
 public String getStatus(){
  return thing;
 }
 
 public String getName(){
  return name;
 }
}

 

 

/*
主类,测试
*/
import java.util.ArrayList;
import java.util.Random;

public class MainClass {

 private Girl girl=null;
 private ArrayList<Boy> boys=new ArrayList<Boy>();
 
 public MainClass() {
  
  girl=new Girl("MM");
  
  Boy boyA=new Boy("小A");
  Boy boyB=new Boy("小B");
  Boy boyC=new Boy("小C");
  Boy boyD=new Boy("小D");
  boys.add(boyA);
  boys.add(boyB);
  boys.add(boyC);
  boys.add(boyD);
  
  girl.addObserver(boyA);
  girl.addObserver(boyB);
  girl.addObserver(boyC);
  girl.addObserver(boyD);
  
  girl.doSomething("脱衣服...");
  girl.doSomething("洗澡...");
  girl.doSomething("感觉有人偷看!?停止洗澡,穿上衣服,开始搜查...");

  girlSearchBadBoy();
  
  //搞定!继续洗澡
  girl.doSomething("再次脱衣服...");
  girl.doSomething("再次洗澡...");
 }
 
 private void girlSearchBadBoy()
 {
  Random rand=new Random();
  
  int unluckyNumber=rand.nextInt( girl.countObservers() );
  Boy unluckyBoy=boys.get(unluckyNumber);
    
  System.out.println(unluckyBoy.getName()+" 暴露,踢出去!");
  girl.deleteObserver(unluckyBoy); 
 }

 
 public static void main(String[] args) {
  new MainClass();
 }
}

相关文章
|
8月前
|
设计模式 消息中间件 前端开发
浅析观察者模式在Java中的应用
观察者模式(Observer Design Pattern),也叫做发布订阅模式(Publish-Subscribe Design Pattern)、模型-视图(Model-View)模式、源-监听器(Source-Listener)模式、从属者(Dependents)模式
107 3
|
2月前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
8月前
|
设计模式 监控 Java
设计模式 - 观察者模式(Observer):Java中的战术与策略
【4月更文挑战第7天】观察者模式是构建可维护、可扩展系统的关键,它在Java中通过`Observable`和`Observer`实现对象间一对多的依赖关系,常用于事件处理、数据绑定和同步。该模式支持事件驱动架构、数据同步和实时系统,但需注意避免循环依赖、控制通知粒度,并关注性能和内存泄漏问题。通过明确角色、使用抽象和管理观察者注册,可最大化其效果。
136 2
|
5月前
|
设计模式 存储 前端开发
【十四】设计模式~~~行为型模式~~~观察者模式(Java)
文章详细介绍了观察者模式(Observer Pattern),这是一种对象行为型模式,用于建立对象之间的一对多依赖关系。当一个对象状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。文中通过交通信号灯与汽车的案例以及多人联机对战游戏的设计方案,阐述了观察者模式的动机和应用场景。接着,文章介绍了观察者模式的结构、角色、优点、缺点以及适用情况,并通过代码示例展示了如何在Java中实现观察者模式。此外,还探讨了观察者模式在MVC架构中的应用以及Java中对观察者模式的支持。
【十四】设计模式~~~行为型模式~~~观察者模式(Java)
|
6月前
|
设计模式 安全 Java
Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
95 1
|
6月前
|
设计模式 存储 安全
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
72 1
|
6月前
|
设计模式 Java
Java面试题:什么是观察者模式以及如何在Java中实现?
Java面试题:什么是观察者模式以及如何在Java中实现?
43 0
|
6月前
|
设计模式 Java
Java面试题:描述观察者模式的工作原理及其在Java中的应用。
Java面试题:描述观察者模式的工作原理及其在Java中的应用。
45 0
|
6月前
|
设计模式 SQL 安全
Java面试题:设计一个线程安全的内存管理器,使用观察者模式来通知所有线程内存使用情况的变化。如何确保在添加和移除内存块时的线程安全?如何确保任务的顺序执行和调度器的线程安全?
Java面试题:设计一个线程安全的内存管理器,使用观察者模式来通知所有线程内存使用情况的变化。如何确保在添加和移除内存块时的线程安全?如何确保任务的顺序执行和调度器的线程安全?
48 0
|
6月前
|
设计模式 存储 缓存
Java面试题:结合单例模式与Java内存模型,设计一个线程安全的单例类?使用内存屏障与Java并发工具类,实现一个高效的并发缓存系统?结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
Java面试题:结合单例模式与Java内存模型,设计一个线程安全的单例类?使用内存屏障与Java并发工具类,实现一个高效的并发缓存系统?结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
46 0