【设计模式】02-观察者模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fengyu6623/article/details/87561481

什么是观察者模式

观察者模式又可以说成是发布订阅模式,字面理解就是被观察者触发动作通知到所有观察者。类比于群主在QQ群里发个消息,所有在群里的成员都能收到消息。

为什么要使用观察者模式

我们知道具体的对象负责它所管辖的范围内的功能,但是需求的实现往往需要多个关系有因果的发生,简单的来说就是事件B的发生时因为事件A的触发。

模拟这样一个场景,假如你开了一家工厂A,者工厂干啥的呢,做衣服。你时不时的接到一些订单,这天又接到一个订单,大单,加工一批衣服。然后你这个工厂A就调用加工衣服的功能吧。可是很不幸的是你没得员工。

这个时候工厂A就得招工人了,然后你一声令下,然后就该干嘛干嘛。工人就开干了,生产经营蒸蒸日上。

这里可以看到工厂就类比于被观察者,工人就是观察者,时刻观察着老板。

这样工厂就可以往里加员工,同时也可以解雇员工,使其不再能监听的工厂的消息任务。

所以观察者模式也就更多的处理这种需要解耦并有因果的逻辑关系。

观察者模式组成

被观察者

public abstract class Subject {



    private Vector<Observer> observers = new Vector<>();



    //增加观察者

    public void addObserver(Observer o){

        this.observers.add(o);

    }



    //移除观察者

    public void removeObserver(Observer o){

        this.observers.remove(o);

    }



    public void notifyObservers(String message){

        for(Observer o : this.observers){

            o.update(this,message);

        }

    }

}

具体被观察者

public class SubjectImp extends Subject {

    public void doSomething(){

        System.out.println("i want to do something");

        super.notifyObservers("something must to be done");

    }

}

观察者

public interface Observer {

    void update(Subject subject, String message);

}

具体观察者

public class ObserverImp implements Observer {



    private final static ExecutorService pool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());



    @Override

    public void update(Subject subject, final String message) {

        pool.execute(() -> System.out.println("observer receive " + " message : " + message));

    }

}

测试驱动

public class Main {

    public static void main(String[] args) {

        SubjectImp subject = new SubjectImp();



        ObserverImp observer1 = new ObserverImp();



        subject.addObserver(observer1);



        ObserverImp observer2 = new ObserverImp();



        subject.addObserver(observer2);

       

        subject.doSomething();

    }

}

有什么需要注意的地方

关于消息处理的及时性这里是需要注意的地方,同步状态下若观察者处理消息太慢或者观察者太多,导致被观察者发送消息被阻塞。所以示例中观察者通过多线程来处理接收到的消息。

猜你喜欢

转载自blog.csdn.net/fengyu6623/article/details/87561481