java设计模式之-观察者模式(发布-订阅模式)

本文介绍了观察者模式的基本概念,包括其定义、结构图及组成部分,并通过具体的Java代码实现了抽象主题、具体主题、抽象观察者与具体观察者的角色。

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 人猿亦猿 阅读( ...) 评论( ...) 编辑 收藏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值