观察者模式

2024-06-17 1654阅读

文章目录

  • UML类图
  • 位置
  • Reader接口
  • RSS接口
  • ReaderOne.java
  • ReaderTwo.java
  • RssData.java
  • Test.java
  • 运行结果

    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 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();
      		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  
      

      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();
        	}
        }
        

        运行结果

        观察者模式

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]