JAVA设计模式之十观察者模式或发布订阅模式

                         JAVA设计模式之十观察者模式或发布订阅模式

一概念:

观察者模式又叫做发布订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。观察者模式又叫发布-订阅(Publish/Subscribe)模式。

二UML类图

JAVA设计模式之十观察者模式或发布订阅模式_第1张图片

三结构

设计模式背景:公司前台作为通知者,,所有职员观察者,,通知者发现老板回来通知所有观察者更新自己,关掉不该开的东西。

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 mObservers=new ArrayList();
    //添加被观察的职工
    @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 

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.当一个对象必须通知其他对象,而它又不能假定其他对象是谁,换言之,你不希望这些对象是紧密耦合的。让耦合的双方都依赖于抽象,而不是依赖于具体










你可能感兴趣的:(JAVA)