Java事件消息訂閱--示例程序

題目鏈接: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短連接的客戶端程序;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章