• 观察者模式


    UML类图

    在这里插入图片描述

    位置

    在这里插入图片描述

    Reader接口

    你会

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

    RSS接口

    接口的话你都会

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

    ReaderOne.java

    • 会写One就会写Two
    • 只是个update更新方法,就把接收到的参数 新信息 赋值给news
    package guanchazhe;
    /*
     * 会写one就复制出Two
     * 是的!!这个方法你写对了
     */
    public class ReaderOne implements Reader{
    
    	@Override
    	public void update(String news) {
    		//那你就输出 更新加news
    		System.out.println("读者1更新:"+news);
    	}
    }
    

    ReaderTwo.java

    同理

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

    RssData.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包,工具包
    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();
    	}
    }
    

    运行结果

    在这里插入图片描述

  • 相关阅读:
    一文了解ChatGPT Plus如何完成论文写作和AI绘图
    准备pmp考试第10天
    XSS进阶一
    Python从零基础入门到精通:一个月就够了
    基于java+SpringBoot+HTML+Mysql基于WEB技术的教学评估管理系统
    java计算机毕业设计学生心理健康信息咨询系统源码+系统+数据库+lw文档
    Apache IoTDB 分布式架构三部曲(二)分片与负载均衡
    【重识云原生】第四章云网络4.7.9节——NFV
    2304: 【递推】铺瓷砖
    git_06_创建分支/查看分支
  • 原文地址:https://blog.csdn.net/m0_75257168/article/details/139611097