yangakw yangakw

设计模式-观察者模式

in 记录read (47) 文章转载请注明来源!

我想用比较简单的方式介绍观察者模式,快速理解观察者模式。

字面理解观察者模式:

  一定要有被观察者(subject)
  还要有观察者(observer)

事实是观察者模式:

  观察者(observer)
  被观察者(subject)
  实际观察者(concreteobserver)
  实际被观察者(concretesubject)

功能:

  被观察者(subject)发生一个行为,观察者们(observer)能做出响应。

实现:

  可以通过subject与observer建立关联,subject发生行为后subject调用observer们执行响应。

优缺点:

   观察者与被观察者之间是属于轻度的关联关系,并且是抽象耦合的,这样,对于两者来说都比较容易进行扩展。
   观察者模式是一种常用的触发机制,它形成一条触发链,依次对各个观察者的方法进行处理。但同时,这也算是观察者模           式一个缺点,由于是链式触发,当观察者比较多的时候,性能问题是比较令人担忧的。并且,在链式结构中,比较容易出现循环引用的错误,造成系统假死。




 abstract class Subject {
    private Vector obs = new Vector();

    public void addObserver(Observer obs){
        this.obs.add(obs);
    }
    public void delObserver(Observer obs){
        this.obs.remove(obs);
    }
    protected void notifyObserver(){
        for(Observer o: obs){
            o.update();
        }
    }
    public abstract void doSomething();
}

class ConcreteSubject extends Subject {
    public void doSomething(){
        System.out.println("被观察者事件反生");
        this.notifyObserver();
    }
}
interface Observer {
    public void update();
}
class ConcreteObserver1 implements Observer {
    public void update() {
        System.out.println("观察者1收到信息,并进行处理。");
    }
}
class ConcreteObserver2 implements Observer {
    public void update() {
        System.out.println("观察者2收到信息,并进行处理。");
    }
}

public class Client {
    public static void main(String[] args){
        Subject sub = new ConcreteSubject();
        sub.addObserver(new ConcreteObserver1()); //添加观察者1
        sub.addObserver(new ConcreteObserver2()); //添加观察者2
        sub.doSomething();
    }
}

运行结果

    被观察者事件反生
    
    观察者1收到信息,并进行处理。
    
    观察者2收到信息,并进行处理。
jrotty WeChat Pay

微信打赏

jrotty Alipay

支付宝打赏

文章二维码

扫描二维码,在手机上阅读!

发表新评论
博客已运行
© 2017 yangakw
PREVIOUS NEXT
雷姆
拉姆