文章目录
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();
}
}