一个情景中,前台给指定员工发送信息,提醒老总回来了,要员工及时关闭无关事情,开始工作。提醒他们老总来了不要玩了。具体代码如下:
这是前台发送者的类
package effective.Observer;
import java.util.ArrayList;
import java.util.List;
public class Secretary {
//同事列表
private List<StockObserver> observers = new ArrayList<StockObserver>();
private String action;
//增加
public void Attch(StockObserver observer){
observers.add(observer);
}
//通知
public void Notify(){
for (StockObserver so : observers) {
so.update();
}
}
//删除通知者
public void delPerson(StockObserver sb){
observers.remove(sb);
}
// 前台状态
public void setAction(String action){
this.action = action;
}
public String getAction(){
return action;
}
}
这是接受者(同事)
public class StockObserver {
private String name ;
private Secretary sub;
public StockObserver(String name , Secretary sub){
this.name = name ;
this.sub = sub;
}
public void update(){
System.out.println(sub.getAction()+","+name+",关闭股票行情,继续工作");
}}
客户端的代码:
//前台ly
Secretary ly = new Secretary();
//看股票的同事
StockObserver ts1 = new StockObserver("陈某某", ly);
StockObserver ts2 = new StockObserver("郑某某", ly);
//前台记下了两位同事
ly.Attch(ts1);
ly.Attch(ts2);
ly.delPerson(ts2);
//发现老板回来
ly.setAction("老板回来了");
//通知同事
ly.Notify();
输出:
老板回来了,陈某某,关闭股票行情,继续工作
从以上代码可知,发送者(前台过于耦合),比如我要发送者是老总,那么就要再写一个老总的类,代码类似。即出现重复代码,或者我要发送者添加新的方法,即要改动原来的代码。这就显得代码不够灵活。
解决的办法是,讲发送者的方法抽象出来,发送者继承该抽象类,无论发送者是前台,还是老总。。都能实现想要的功能,并且代码客服有性高,若 老总还需要添加其他方法(如加工资)也可以相应增加,改动量就很小。
具体代码如下:
发送
package effective.Observer2;
/**
* 发送者的抽象
* @author 李宇
*
*/
public abstract class SendMsg {
protected String position;//职位
protected String action;//发送者要做出的行动
protected String msg;
public SendMsg(String posi,String action){
this.position = posi;
this.action = action;
}
abstract void sendMsg(String msg);//发送信息
abstract void addPerson(Person person);//添加发送的人
abstract void delPerson(Person person);//删除发送的人
abstract void setAction(String action);//发送者要做出的行动
}
接受者的抽象类:
package effective.Observer2;
/**
* 接受者的抽象类
* @author 李宇
*
*/
public abstract class Observer {
protected String name ;
protected SendMsg send;
protected String action;
public Observer(String name , SendMsg send){
this.name = name;
this.send = send;
}
public abstract void action();//观察者要做出的行动
}
发送者的类:
package effective.Observer2;
import java.util.ArrayList;
import java.util.List;
public class Boss extends SendMsg {
public Boss(String posi, String action) {
super(posi, action);
}
List<Person> list = new ArrayList<Person>();
@Override
public void sendMsg(String msg) {
// TODO Auto-generated method stub
super.msg = msg;
}
@Override
public void addPerson(Person person) {
// TODO Auto-generated method stub
list.add(person);
}
@Override
void delPerson(Person person) {
// TODO Auto-generated method stub
list.remove(person);
}
@Override
void setAction(String action) {
// TODO Auto-generated method stub
super.action = action;
}
}
接受者的类:
public class Person extends Observer{
public Person(String name, SendMsg send) {
super(name, send);
// TODO Auto-generated constructor stub
}
@Override
public void action() {
// TODO Auto-generated method stub
System.out.println(super.send.position+" "+super.send.action+" "+super.send.msg+" "+super.name+"关闭NBA,赶紧工作");
}
}
客户端:
Boss boss1 = new Boss("老板","回来了");
boss1.sendMsg(" 准备开会 !!");
Person pes1 = new Person("小李",boss1);
Person pes2 = new Person("小张",boss1);
boss1.addPerson(pes1);
boss1.addPerson(pes2);
pes1.action();
pes2.action();
输出:
老板 回来了 准备开会 !! 小李关闭NBA,赶紧工作
老板 回来了 准备开会 !! 小张关闭NBA,赶紧工作
所以观察者模式,适用于 一个对象改名,同事改变其他对象的时候