观察者模式

1:Subject.java

package cn.javass.dp.observer.example2;

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

/**
 * 目标对象,作为被观察者
 */
public class Subject {
 /**
  * 用来保存注册的观察者对象,也就是报纸的订阅者
  */
 private List<Observer> readers = new ArrayList<Observer>();
 /**
  * 报纸的读者需要先向报社订阅,先要注册
  * @param reader 报纸的读者
  * @return 是否注册成功
  */
 public void attach(Observer reader) {
  readers.add(reader);
 }
 /**
  * 报纸的读者可以取消订阅
  * @param reader 报纸的读者
  * @return 是否取消成功
  */
 public void detach(Observer reader) {
  readers.remove(reader);
 }
 /**
  * 当每期报纸印刷出来后,就要迅速的主动的被送到读者的手中,
  * 相当于通知读者,让他们知道
  */
 protected void notifyObservers() {
  for(Observer reader : readers){
   reader.update(this);
  }
 }
}

 

2:client

package cn.javass.dp.observer.example2;

public class Client {
 public static void main(String[] args) {
  //创建一个报纸,作为被观察者
  NewsPaper subject = new NewsPaper();
  
  //创建阅读者,也就是观察者
  Reader reader1 = new Reader();
  reader1.setName("张三");
  
  Reader reader2 = new Reader();
  reader2.setName("李四");
  
  Reader reader3 = new Reader();
  reader3.setName("王五");
  
  //注册阅读者
  subject.attach(reader1);
  subject.attach(reader2);
  subject.attach(reader3);
  
  //要出报纸啦
  subject.setContent("本期内容是观察者模式");
 }
}

 

 

3:NewsPaper

package cn.javass.dp.observer.example2;
import java.util.*;
/**
 * 报纸对象,具体的目标实现
 */
public class NewsPaper extends Subject{
 /**
  * 报纸的具体内容
  */
 private String content;
 /**
  * 获取报纸的具体内容
  * @return 报纸的具体内容
  */
 public String getContent() {
  return content;
 }
 /**
  * 示意,设置报纸的具体内容,相当于要出版报纸了
  * @param content 报纸的具体内容
  */
 public void setContent(String content) {
  this.content = content;
  //内容有了,说明又出报纸了,那就通知所有的读者
  notifyObservers();
 }
}

 

4:Observer

package cn.javass.dp.observer.example2;
/**
 * 观察者,比如报纸的读者
 */
public interface Observer {
 /**
  * 被通知的方法
  * @param subject 具体的目标对象,可以获取报纸的内容
  */
 public void update(Subject subject);
}

5:Reader

 

package cn.javass.dp.observer.example2;
/**
 * 真正的读者,为了简单就描述一下姓名
 */
public class Reader implements Observer{
 /**
  * 读者的姓名
  */
 private String name;

 public void update(Subject subject) {
  //这是采用拉的方式
  System.out.println(name+"收到报纸了,阅读先。内容是==="+((NewsPaper)subject).getContent());
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值