java设计模式之-观察者模式(发布-订阅模式)
2017-11-01 16:37
477 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25931677/article/details/89348138
java设计模式之-观察者模式(发布-订阅模式)
1.观察者模式定义
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。
这个主题对象在状态上发生变化时,会通知所有观察者对象,让它们能够自动更新自己。
2.观察者模式结构图
3.观察者模式的构成
● 抽象主题(Subject)角色:抽象主题角色把所有对观察者对象的引用保存在一个聚集(比如ArrayList对象)里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象,抽象主题角色又叫做抽象被观察者(Observable)角色。
● 具体主题(ConcreteSubject)角色:将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色又叫做具体被观察者(Concrete Observable)角色。
● 抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到主题的通知时更新自己,这个接口叫做更新接口。
● 具体观察者(ConcreteObserver)角色:存储与主题的状态自恰的状态。具体观察者角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态 像协调。如果需要,具体观察者角色可以保持一个指向具体主题对象的引用。
4.代码实现
抽象主题(Subject)角色:
1 package main.java.pub_sub2; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 /** 7 * @ClassName: Subject 8 * @Description: 抽象主题(Subject)角色 9 * @author JinXing 10 * @date 2017年11月1日 下午2:00:52 11 * 12 */ 13 public abstract class Subject { 14 15 private List<Observer> list=new ArrayList<Observer>(); 16 17 /** 18 * 注册观察者 19 * @Title: addObserver 20 * @author JinXing 21 * @date 2017年11月1日 下午2:04:33 22 * @param obj 23 * @return void 24 */ 25 public void addObserver(Observer obj){ 26 list.add(obj); 27 } 28 29 /** 30 * 删除观察者 31 * @Title: delObserver 32 * @author JinXing 33 * @date 2017年11月1日 下午2:04:33 34 * @param obj 35 * @return void 36 */ 37 public void delObserver(Observer obj){ 38 list.remove(obj); 39 } 40 41 /** 42 * 通知所有的观察者 43 * @Title: notifyAllObserver 44 * @author JinXing 45 * @date 2017年11月1日 下午2:11:34 46 * @param @param msg 47 * @return void 48 */ 49 public void notifyAllObserver(){ 50 for (Observer observer : list) { 51 observer.update(this); 52 } 53 } 54 55 }
具体主题(ConcreteSubject)角色:
1 package main.java.pub_sub2; 2 3 /** 4 * @ClassName: GameSubject 5 * @Description: 游戏主题 6 * @author JinXing 7 * @date 2017年11月1日 下午2:13:08 8 * 9 */ 10 public class GameSubject extends Subject{ 11 12 private String name;//发布人 13 private String content;//发布内容 14 15 public String getName() { 16 return name; 17 } 18 public String getContent() { 19 return content; 20 } 21 22 public void setName(String name) { 23 this.name = name; 24 } 25 public void setContent(String content) { 26 this.content = content; 27 } 28 public GameSubject() { 29 super(); 30 } 31 public GameSubject(String name, String content) { 32 super(); 33 this.name = name; 34 this.content = content; 35 } 36 37 @Override 38 public String toString() { 39 return "GameSubject [name=" + name + ", content=" + content + "]"; 40 } 41 /** 42 * 开始主题活动 43 * @Title: sendSubject 44 * @author JinXing 45 * @date 2017年11月1日 下午2:13:26 46 * @param @param msg 47 * @return void 48 */ 49 public void sendSubject(GameSubject sub){ 50 51 System.out.println("当前主题为:"+sub.getContent()); 52 this.notifyAllObserver(); 53 } 54 }
抽象观察者(Observer)角色:
1 package main.java.pub_sub2; 2 3 /** 4 * @ClassName: Observer 5 * @Description: 抽象观察者(Observer)角色 6 * @author JinXing 7 * @date 2017年11月1日 下午2:14:52 8 * 9 */ 10 public interface Observer { 11 12 public void update(Subject subject); 13 14 }
具体观察者(ConcreteObserver)角色:
1 package main.java.pub_sub2; 2 3 /** 4 * @ClassName: PcPlayer 5 * @Description:PC玩家 (观察者) 6 * @author JinXing 7 * @date 2017年11月1日 下午2:18:44 8 * 9 */ 10 public class PcPlayer implements Observer{ 11 12 @Override 13 public void update(Subject sub) { 14 GameSubject gameSub=(GameSubject) sub; 15 String msg=gameSub.getContent(); 16 if(msg!=null){ 17 msg=msg.toLowerCase(); 18 } 19 20 if(msg.contains("pc")){ 21 System.out.println("PC玩家:我对这个主题非常感兴趣!"); 22 }else{ 23 System.out.println("PC玩家:这个主题很无聊!"); 24 } 25 26 System.out.println("本次游戏主题发布者:"+gameSub.getName()); 27 28 } 29 30 }
测试:
1 package main.java.pub_sub2; 2 3 public class Test { 4 5 public static void main(String[] args) { 6 7 String name="jack"; 8 String content="英雄联盟手游版+PC版"; 9 10 //主题对象 11 GameSubject sub=new GameSubject(name,content); 12 //观察者对象 13 Observer obj1=new PcPlayer(); 14 //添加观察者 15 sub.addObserver(obj1); 16 sub.sendSubject(sub); 17 18 } 19 20 }
posted @ 2017-11-01 16:37 人猿亦猿 阅读(...) 评论(...) 编辑 收藏
相关文章推荐
- java设计模式-观察者(发布-订阅)模式
- JAVA设计模式——观察者模式(发布-订阅模式)
- Java 设计模式之观察者模式(发布/订阅模式)
- java笔记--设计模式之观察者(订阅/发布)模式
- Java设计模式之观察者模式(发布/订阅模式)
- 设计模式(三):观察者模式与发布/订阅模式区别
- 设计模式--观察者模式(发布订阅模式)
- 设计模式篇一:观察者模式与发布-订阅模式
- js设计模式中发布与订阅实现观察者模式例子
- 设计模式之观察者模式(发布-订阅模式publish/Subscribe)
- 设计模式初探-观察者模式(OBSERVER)又称发布-订阅(Publish-Subscribe)依赖(Dependents)
- 学习javascript设计模式之发布-订阅(观察者)模式
- 设计模式(二)观察者模式和发布订阅模式(Observer)
- 观察者模式 Observer 发布订阅模式 源 监听 行为型 设计模式(二十三)
- 设计模式-观察者模式(发布订阅模式)
- 【GOF23设计模式】_观察者模式_广播机制_消息订阅_网络游戏对战原理_自带类与接口JAVA251-252
- 设计模式(三)观察者模式Observer(发布订阅)
- 设计模式--观察者模式(发布订阅模式)
- JS设计模式 - 观察者模式与发布/订阅模式
- 十六 设计模式之观察者模式(发布订阅模式)