JAVA设计模式之十观察者模式或发布订阅模式
一概念:
观察者模式又叫做发布订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。观察者模式又叫发布-订阅(Publish/Subscribe)模式。
二UML类图
三结构
设计模式背景:公司前台作为通知者,,所有职员观察者,,通知者发现老板回来通知所有观察者更新自己,关掉不该开的东西。
Subject类,主题类或者抽象通知者,一般用一个抽象类或者一个接口实现,它把所有对观察者对象的引用保存在一个集合里,每个抽象通知者可以有任何数量的观察者。它提供增加和删除观察者对象的方法。
//抽象通知者接口
public interface Subject {
public void attach(Observer mObserver);
public void detach(Observer mObserver);
public void notifyOb();
}
Observer 抽象观察者,为所有的具体的观察者定义一个接口,在得到具体通知者的通知时更新自己。里边包含一个UpData()方法。
//抽象的观察者 带有更新的方法
//为那些在目标发生改变时需要获得通知的对象定义一个更新接口。
public interface Observer {
public void update();
}
ConCreteSubject具体的通知者对象它内部状态改变时会发出通知 前台或者老板自己都可以是具体通知者。
//具体的通知者 前台
public class ConCreteSubject implements Subject{
//要通知的抽象观察者列表
private List<Observer> mObservers=new ArrayList<Observer>();
//添加被观察的职工
@Override
public void attach(Observer mObserver) {
mObservers.add(mObserver);
}
//移除被观察的职工
@Override
public void detach(Observer mObserver) {
mObservers.remove(mObserver);
}
//通知所有更新的方法
@Override
public void notifyOb() {
for (int i = 0; i <mObservers.size(); i++) {
mObservers.get(i).update();
}
}
}
ConCreteObserver是具体的观察者 本例子StaffOne和StaffTwo都是
//具体观察者 接到通知改变自身
public class StaffOne implements Observer{
@Override
public void update() {
Log.d("TAG", "update: -------------职员1收到通知------前台说老板回来了关掉股票");
}
}
//具体观察者 接到通知改变自身
public class StaffTwo implements Observer{
@Override
public void update() {
Log.d("TAG", "update: -------------职员2收到通知------前台说老板回来了关掉游戏");
}
}
客户端代码
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//创建具体的前台通知者对象
ConCreteSubject conCreteSubject=new ConCreteSubject();
//创建观察者员工们
StaffOne staffOne=new StaffOne();
StaffTwo staffTwo=new StaffTwo();
//添加给通知者前台
conCreteSubject.attach(staffOne);
conCreteSubject.attach(staffTwo);
//前台改变自身状态说老板回来了通知观察者改变自身
conCreteSubject.notifyOb();
}
}
4使用场景:
1.当一个抽象模型有两个方面,其中一个方面依赖于另一方面。将这二者封装在独立的对象中可以使他们各自独立地改变和复用。
2.当对一个对象的改变需要同时改变其它对象,而不知道具体由多少对象有待改变。
3.当一个对象必须通知其他对象,而它又不能假定其他对象是谁,换言之,你不希望这些对象是紧密耦合的。让耦合的双方都依赖于抽象,而不是依赖于具体