题目链接:https://www.icourse163.org/learn/PKU-1001941004?tid=1450230441#/learn/hw?id=1222245410
一个模拟事件消息订阅的程序,请阅读并修改。
主要是加上一个自已的订阅者,并且该订阅者要用匿名类来实现。(基本要求占8分)
如果可以,也加上用Lambda来实现的订阅者。(较高要求,占2分)。
原题:
/**
* 一个简单的新闻事件侦听演示程序
* @author tds
* @author 修改者:
*/
public class NewsDemo {
public static void main(String[] args) {
//模拟有一家新闻社
NewsAgency bbc = new NewsAgency("BBC");
//订阅该社的新闻
bbc.addListener(new MyListener());
//TODO 请在这里再加入一个Listener
//START
//END
//新闻社启动其工作流程
bbc.start();
}
}
/**
* 事件信息
*/
class NewsEvent{
Object source; //事件来源
String text; //事件内容
int level; //事件级别
NewsEvent(Object source, String text, int level){
this.source=source;
this.text = text;
this.level = level;
}
}
interface Listener{
void newsArrived(NewsEvent e);
}
/**
* 新闻机构
*/
class NewsAgency {
String name; //机构名
public NewsAgency(String name) {
this.name = name;
}
Listener[] listeners = new Listener[100]; //侦听者(订阅者)
int listenerCnt = 0; //已有的订阅者
//加入一个订阅者
void addListener(Listener oneListener){
if(listenerCnt<listeners.length){
listeners[listenerCnt] = oneListener;
listenerCnt++;
}
}
//模拟一个事件发生,并通知所有的订阅者
void start(){
NewsEvent event = new NewsEvent("Mr. Joan", "Bombing", 9 );
for(int i=0; i<listenerCnt; i++) {
listeners[i].newsArrived(event);
}
}
}
/**
* 实现一个订阅者
*/
class MyListener implements Listener{
//当接收到消息后,进行一些显示
public void newsArrived(NewsEvent e){
if( e.level>5) System.out.println("warning :");
System.out.println("please note," + e.text + " happed!");
}
}
解答:
package week5;
/**
* 一个简单的新闻事件侦听演示程序
* @author tds
* @author 修改者:
*/
public class NewsDemo {
public static void main(String[] args) {
//模拟有一家新闻社
NewsAgency bbc = new NewsAgency("BBC");
//订阅该社的新闻
bbc.addListener(new MyListener());
//TODO 请在这里再加入一个Listener
//START
//用匿名类实现
bbc.addListener(new Listener(){
public void newsArrived(NewsEvent e)
{
if( e.level>5) System.out.println("匿名类实现---warning :");
System.out.println("please note," + e.text + " happed!");
}
});
//Lambda函数实现
bbc.addListener((NewsEvent e)->{
if( e.level>5) System.out.println("Lambda实现---warning :");
System.out.println("please note," + e.text + " happed!");
});
//END
//新闻社启动其工作流程
bbc.start();
}
}
/**
* 事件信息
*/
class NewsEvent{
Object source; //事件来源
String text; //事件内容
int level; //事件级别
NewsEvent(Object source, String text, int level){
this.source=source;
this.text = text;
this.level = level;
}
}
interface Listener{
void newsArrived(NewsEvent e);
}
/**
* 新闻机构
*/
class NewsAgency {
String name; //机构名
public NewsAgency(String name) {
this.name = name;
}
Listener[] listeners = new Listener[100]; //侦听者(订阅者)
int listenerCnt = 0; //已有的订阅者
//加入一个订阅者
void addListener(Listener oneListener){
if(listenerCnt<listeners.length){
listeners[listenerCnt] = oneListener;
listenerCnt++;
}
}
//模拟一个事件发生,并通知所有的订阅者
void start(){
NewsEvent event = new NewsEvent("Mr. Joan", "Bombing", 9 );
for(int i=0; i<listenerCnt; i++) {
listeners[i].newsArrived(event);
}
}
}
/**
* 实现一个订阅者
*/
class MyListener implements Listener{
//当接收到消息后,进行一些显示
public void newsArrived(NewsEvent e){
if( e.level>5) System.out.println("warning :");
System.out.println("please note," + e.text + " happed!");
}
}
效果:
warning :
please note,Bombing happed!
匿名类实现---warning :
please note,Bombing happed!
Lambda实现---warning :
please note,Bombing happed!
思考:
除了典型的事件监听程序,在一些网络程序中也可以使用这种方式,如采用tcp短连接的客户端程序;