设计模式(第十九式:观察者模式)

概念:
  观察者模式:Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notifued and updated automatically. 定义对象间的一种一对多的依赖关系,使得每当一个对象改变状态,其他所有依赖它的对象都会得通知并被自动更新。

实现:
  定义观察者接口

    public interface Observer {

        void clicked(Clieckable clieckable);
        
    }


  定义被观察者接口

    public interface Clieckable {
        void click();

        void addObserver(Observer observer);

        void delObserver(Observer observer);
    }


  观察者具体实现

    public class ButtonObserver implements Observer {
        @Override
        public void clicked(Clieckable clieckable) {
            System.out.println("作为一个观察者,我当然看到按钮被点了。");
        }
    }


  被观察者具体实现

    public class Button implements Clieckable {
        List<Observer> list = new ArrayList<>();

        @Override
        public void click() {
            System.out.println("按钮被点击了");
            list.forEach(item->{
                item.clicked(this);
            });
        }

        @Override
        public void addObserver(Observer observer) {
            list.add(observer);
        }

        @Override
        public void delObserver(Observer observer) {
            list.remove(observer);
        }
    }


测试及结果:

    @Test
    public void observerTest(){
        Button button = new Button();
        button.addObserver(new ButtonObserver());
        button.click();
    }


    按钮被点击了
    作为一个观察者,我当然看到按钮被点了。

分析:
  1.在抽象出接口或者抽象类后扩展都变得非常方便。
  2.广播式通信,被观察者可以添加多个观察者对象,在相同的观察主题下,支持一对多的通知模式。
  3.在单线程下,如果有多个观察者,可能对于通知观察者需要的时间更长一下,在for循环中处于串联式通知;必要的时候可以考虑多线程异步通知。
  4.观察者模式属于处于单项通知,有些类似于偷拍的感觉,观察者可以实时知道被观察者的状态,但是被观察者并不能得知自己处于一个被观察的状态。
  5.适用场景:
    a.一组被同意事物控制的行为。比如跑步的信号枪。

    b.事件多级出发。比如公司的款项报销审批流程。c.跨系统的消息队列处理。

    ...

posted @ 2019-07-04 17:39  Mario0315  阅读(133)  评论(0编辑  收藏  举报