观察者模式

文章目录

UML类图

位置

Reader接口

你会

java 复制代码
package guanchazhe;
/*
 * 这个你会,抽象方法
 */
public interface Reader {
	public void update(String news);
}

RSS接口

接口的话你都会

java 复制代码
package guanchazhe;
/*
 * 接口你都会
 */
public interface RSS {
	public void subscribeRSS(Reader readers);
	public void cancleRSS(Reader readesr);
}

ReaderOne.java

  • 会写One就会写Two
  • 只是个update更新方法,就把接收到的参数 新信息 赋值给news
java 复制代码
package guanchazhe;
/*
 * 会写one就复制出Two
 * 是的!!这个方法你写对了
 */
public class ReaderOne implements Reader{

	@Override
	public void update(String news) {
		//那你就输出 更新加news
		System.out.println("读者1更新:"+news);
	}
}

ReaderTwo.java

同理

java 复制代码
package guanchazhe;
/*
 * 是的!!这个方法你写对了
 */
public class ReaderTwo implements Reader{
	@Override
	public void update(String news) {
		System.out.println("读者2更新:"+news);
	}
}

RssData.java

这个是方法最多最复杂的,但是认真读注释,理解逻辑,我相信你能写出来的。

java 复制代码
package guanchazhe;

/*
 * 工具包!!!util 不要导错包
 * 期末考试只写关键代码
 */
import java.util.ArrayList;
import java.util.List;


public class RssData implements RSS{
	//尖括号表示泛型
	//这两个你会
	private List<Reader> readers;
	private String news;
	
	@Override
	//这个是实现接口重写的方法,一共两个
	public void subscribeRSS(Reader reader){
		/*
		 * 本质还是输出,
		 * 读题,是订阅RRS,并且参数是一个读者
		 * 就是读者订阅RRS
		 * 
		 * 首先判断读者在不在readers这个list中
		 * contains()方法,add()方法是list自带的
		 * 如果不包含,就先添加,然后输出订阅信息;不然的话,就输出 已经是会员不能再 订阅
		 * 方法完成
		 */
		
		
		//订阅期刊
		//当用户不在里面
		if(!readers.contains(reader)){
			readers.add(reader);
			System.out.println("该用户订阅成功");
		}else{
			System.out.println("该用户已是会员,不能再次订阅");
		}
		
	}
	
	//这个也是实现接口重写的方法
	public void cancleRSS(Reader reader){
		/*
		 * 这个是取消订阅的方法,并且传入 一个读者的参数,就说明这个方法是 一个读者取消订阅
		 * remove()方法也是list自带的方法
		 * 
		 * 判断,如果这个读者包含在readers这个list里面,那就先将这个读者从list移除,再输出 该读者已取消订阅;
		 * 不然的话,就说明读者不在list里里面,那自然不能取消订阅,所以就输出 用户不是会员,不能取消订阅
		 */
		if(readers.contains(reader)){
			readers.remove(reader);
			System.out.println("该用户取消订阅成功");
		}else{
			System.out.println("该用户不是会员,不能取消订阅");
		}
	}
	
	
	//构造!!!!
	public RssData(){
		/*
		 * 你看 rssdata Rss的数据,要包括什么呢?读者列表和信息 
		 * readers这个list 和 news在最上面定义过了
		 * readers要创建对象,news赋值
		 */
		
		readers = new ArrayList<Reader>();
		news = "";
	}
	
	/*
	 * setnews 就是把新信息赋给 news
	 */
	public void setNews(String updateNews){
		news = updateNews;
	}
	
	/*
	 * 通知reader的方法
	 * 是不是要通知每一个读者,怎么通知 每一个?遍历
	 * 遍历readers这个list 的所有元素
	 * 
	 * 
	 * 建议:增强for循环:r.update();直接调用
	 * 普通for循环:readers.get(i) 得到元素再打点调用update()
	 * 		get()方法也是list自带的
	 */
	public void notifyReaders(){
		//遍历
		for(int i = 0;i < readers.size();i++){
			//先从集合中取出来,然后再调用
			readers.get(i).update(news);
			System.out.println("普通的for循环");
		}
		
		//这个更好
		//在写集合的时候 大多数都是用增强for循环
		//不用关注集合大小(越界异常),步骤简单
		for(Reader r :readers){
			//直接再箱子里找见然后调用
			r.update(news);
			System.out.println("增强for循环");
		}
	}
}

Test.java

这里使用的是单元测试的方法,要注意:

  • class类名不能是Test
  • 不是main方法
  • 写的单元测试方法之前要写@Test,并且导入 util包,工具包
java 复制代码
package guanchazhe;

import org.junit.Test;

/*
 * RSS 订阅中心
 * subScribe 订阅
 * cancel 取消
 * reader 读者  注意导自己写的包
 */
public class TestRSS {
	//使用单元测试时,class 不能写Test
	
	@Test
	public void testRSS(){
		/*
		 * 首先,得有读者吧,所以要创建两个读者对象
		 * 还得有信息和readers list吧,这个都在RssData里面,所以新建RssData 对象
		 * 
		 * 只有订阅中心RSS才能 
		 * 					加 读者 进readers list , subscribe
		 * 					取消读者,				cancle
		 * 					设置新消息				setNews
		 * 					最后再通知所有读者		notifyReaders
		 */
		RssData rss = new RssData();
		Reader one = new ReaderOne();
		Reader two = new ReaderTwo();

		
		rss.subscribeRSS(one);
		rss.subscribeRSS(two);
		
		rss.cancleRSS(one);
		rss.setNews("快期末了,抓紧复习");		
		rss.notifyReaders();
	}
}

运行结果

相关推荐
西岭千秋雪_10 小时前
设计模式の中介者&发布订阅&备忘录模式
java·观察者模式·设计模式·中介者模式·备忘录模式
东风吹柳3 天前
观察者模式(sigslot in C++)
c++·观察者模式·信号槽·sigslot
T1an-13 天前
设计模式之【观察者模式】
观察者模式·设计模式
真想骂*7 天前
观察者模式:它究竟在观察什么?
java·开发语言·观察者模式
夏旭泽7 天前
设计模式-观察者模式
观察者模式·设计模式
澄澈i8 天前
设计模式学习[12]---观察者模式
学习·观察者模式·设计模式
问道飞鱼11 天前
【设计模式】观察者模式深度讲解
观察者模式·设计模式
吾与谁归in12 天前
【C#设计模式(20)——观察者模式(Observer Pattern)】
观察者模式·设计模式·c#
你又食言了哦19 天前
C++观察者模式Observer
开发语言·c++·观察者模式
ohMyGod_12319 天前
手写观察者模式
观察者模式