各种模式不是一种新技术而是前辈中总结出解决各种问题的方式,观察者模式比较适合与当一个类发生变化的时候,有很多的类就做出相应变化。在这种类型下比较适合使用观察者模式:
在这里举一个例子,其中的角色有 老板 员工(简单期间只员工只有司机,秘书)当老板要出去开会的时候给秘书司机发送信息,之后秘书会准备相关资料而司机就是开车,具体代码如下:
1、老板的抽象:
/**
*
*/
package com.baoss;
import java.util.ArrayList;
import java.util.List;
/**
*@author WHD
*2014-10-24
*/
/* *
* 被观察这里要记录有哪些观察者注册了,而且还可以进行观察者的注册,观察者的删除
*
*/
public interface Boss {
//保存观察者
List<Staff> list= new ArrayList<Staff>();
//添加观察者
public void addStaff(Staff staff);
//删除观察者
public void removeStaff(Staff staff);
//通知观察者
public void notice(String str);
}
2、具体老板(你的老板)
/**
*
*/
package com.baoss;
/**
*@author WHD
*2014-10-24
*/
/*
*被观察者的实现,这里就是我们的具体老板,实现了注册,删除以及保存注册者的方法
*/
public class BossImp implements Boss{
@Override
public void addStaff(Staff staff) {
list.add(staff);
}
@Override
public void removeStaff(Staff staff) {
list.remove(staff);
}
@Override
public void notice(String str) {
// 通过遍历获取所有注册过的观察者
for(Staff staff:list){
staff.update(str);
}
}
}
3、员工抽象
/**
*
*/
package com.baoss;
/**
*@author WHD
*2014-10-24
*/
public interface Staff {
//被观察者发送消息的时候调用发送通知
public void update(String str);
}
4、秘书具体员工 (观察者)
/**
*
*/
package com.baoss;
/**
*@author WHD
*2014-10-24
*/
/*
* 秘书是一个具体的员工,也就是一个老板的观察者
*/
public class Secretary implements Staff{
@Override
public void update(String str) {
doSome(str);
}
private void doSome(String str){
System.out.println("秘书"+str);
}
}
5、司机具体员工(观察者)
package com.baoss;
/**
*@author WHD
*2014-10-24
*/
public class Driver implements Staff {
@Override
public void update(String str) {
doSome(str);
}
private void doSome(String str){
System.out.println("司机"+str);
}
}
6、测试类
/**
*
*/
package com.baoss;
/**
*@author WHD
*2014-10-24
*/
// 测试类
public class Test {
public static void main(String[]args){
//获取主体对象
Boss boss= new BossImp();
//观察者
Staff sec=new Secretary();
Staff dri= new Driver();
//注册
boss.addStaff(sec);
boss.addStaff(dri);
//向注册过的观察者发送信息
boss.notice("我要出去");
}
}