-------------------------------------------------------天道酬勤
观察者设计模式
解决的问题:当一个对象发生指定的动作时,另外一个对象要做出相应处理的时候。
比如天气站播报天气,不同人群对天气的处理方式不同。观察者设计模式就是解决这一类问题的。
代码:
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.在当前对象维护接口的引用,在当前对象发生指定的动作时,这时可以调用接口中的方法了。(多态)
---------------------------------共勉