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.在当前对象维护接口的引用,在当前对象发生指定的动作时,这时可以调用接口中的方法了。(多态)

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

 

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