Java之觀察者設計模式

-------------------------------------------------------天道酬勤

觀察者設計模式

解決的問題:當一個對象發生指定的動作時,另外一個對象要做出相應處理的時候。

比如天氣站播報天氣,不同人羣對天氣的處理方式不同。觀察者設計模式就是解決這一類問題的。

代碼:

package day08;

public interface Weather {
	public abstract void weatherNotify(String kind);//通知天氣,具體活動看具體實現該接口的類
}

package day08;

public class Student implements Weather{
	private String name;
	public Student() {
	}
	public Student(String name)
	{
		this.name=name;
	}
	@Override
	public void weatherNotify(String kind) {
		switch(kind)
		{
			case "颳風":
			{
				System.out.println(this.name+"抱着石頭去上課!");
				break;
			}
			case "下雨":
			{
				System.out.println(this.name+"撐着雨傘去上課!");
				break;
			}
			case "晴天":
			{
				System.out.println(this.name+"開開心心去上課!");
				break;
			}
			case "陰天":
			{
				System.out.println(this.name+"心情鬱悶去上課!");
				break;
			}
			case "霧霾":
			{
				System.out.println(this.name+"帶着面罩去上課!");
				break;
			}
			default:
				System.out.println("參數錯誤");
		}
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
}


package day08;

public class Teacher implements Weather{
	private String name;
	public Teacher() {
	}
	public Teacher(String name)
	{
		this.setName(name);
	}
	@Override
	public void weatherNotify(String kind) {
		switch(kind)
		{
			case "颳風":
			{
				System.out.println(this.name+"開車去給學生上課!");
				break;
			}
			case "下雨":
			{
				System.out.println(this.name+"撐着雨傘去給學生上課!");
				break;
			}
			case "晴天":
			{
				System.out.println(this.name+"小步慢走去給學生上課!");
				break;
			}
			case "陰天":
			{
				System.out.println(this.name+"心情鬱悶地去給學生上課!");
				break;
			}
			case "霧霾":
			{
				System.out.println(this.name+"帶着面罩去給學生上課!");
				break;
			}
			default:
				System.out.println("參數錯誤");
		}
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}


package day08;

import java.util.ArrayList;
import java.util.ListIterator;
import java.util.Random;

//天氣站

public class WeatherStation {
	private String[] weathers= {"颳風","下雨","晴天","陰天","霧霾"};
	private ArrayList<Weather> list=new ArrayList<Weather>();
	public WeatherStation()
	{}
	public void weatherReport() throws Exception
	{
		Random r=new Random();
		while(true)
		{
			int sleepTime=r.nextInt(1001)+500;//1-1.5s通知一次天氣
			Thread.sleep(sleepTime);
			int weatherKind=r.nextInt(5);
			System.out.println("今天是"+weathers[weatherKind]);
			for(Weather m:list)
			{
				m.weatherNotify(weathers[weatherKind]);
			}
		}
	}
	public void addMember(Weather member)
	{
		list.add(member);
	}
	public void removeMember(Weather member)
	{
		ListIterator<Weather> it=list.listIterator();
		while(it.hasNext())
		{
			Weather m=it.next();
			if(m==member)
			{
				it.remove();
			}
		}
	}
}

package day08;

public class ObserverMode {
	public static void main(String[] args) throws Exception
	{
		Student s1=new Student("小明同學");
		Student s2=new Student("小麗同學");
		Teacher t1=new Teacher("王老師");
		Teacher t2=new Teacher("周老師");
		WeatherStation weatherStation=new WeatherStation();
		weatherStation.addMember(s1);
		weatherStation.addMember(s2);
		weatherStation.addMember(t1);
		weatherStation.addMember(t2);
		weatherStation.weatherReport();
	}
}

運行結果如下:

步驟:

1.定義一個接口,將處理活動的方法定義在接口中。

2.在當前對象維護接口的引用,在當前對象發生指定的動作時,這時可以調用接口中的方法了。(多態)

                                              ---------------------------------共勉

 

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