-------------------------------------------------------天道酬勤
觀察者設計模式
解決的問題:當一個對象發生指定的動作時,另外一個對象要做出相應處理的時候。
比如天氣站播報天氣,不同人羣對天氣的處理方式不同。觀察者設計模式就是解決這一類問題的。
代碼:
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.在當前對象維護接口的引用,在當前對象發生指定的動作時,這時可以調用接口中的方法了。(多態)
---------------------------------共勉