观察者模式:
一、观察者模式中的角色:
1、抽象主体事物(被观察者抽象)、具体主体事物(被观察者的实现)、抽象观察者、具体观察者
2、各角色中的变量方法:抽象主体事物中定义观察者添加、删除、通知方法,以及一个保存要观察这个主体的观察者,具体主体事物就是实现这些抽象方法,观察者的抽象中定义一个抽象方法该方法就是发现被观察者有所变化之后要做一些事情,而具体观察者就是实现这个方法。
3、观察者模式就是一个一对多的关系。
二、简单举例并简单实现
1、老板、秘书、司机,其中老板是事物主体(被观察者),秘书、司机是观察者当老板要出去开会秘书干一些事如准备资料,司机要开车,这里的秘书和司机相当于已经注册了,如果没注册也就是不是这个公司的人的话也就不是到了。
2、代码实现:
(1)抽象主体(Boss):
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)具体主体(你的boss)
/**
*
*/
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("我要出去");
}
}