观察者设计模式(Observer Pattern)

 

GOF设计模式
Observer Pattern

 

观察者设计模式

观察者模式比喻
• 想知道咱们公司最新MM情报吗?加入公司的MM情报邮件组就行了,tom负责搜集情报,他发现的新情报不用一个一个通知我们,直接发布给邮件组,我们作为订阅者(观察
者)就可以及时收到情报啦。
• 观察者模式:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更新。


• 抽象主题( Subject ) 角色:
• 主题角色把所有的观察者对象的引用保存在一个列表里;每个主题都可以有任何数量的观察者。主题提供一个接口可以加上或撤销观察者对象;主题角色又叫做抽象被观察者(Observable)角色;

 

import java.util.ArrayList;
import java.util.List;
import java.util.jar.Pack200;

/**
 * Created by Administrator on 2017/2/14.
 */
public class Subject {
    List<Observer> list=new ArrayList<>();
    public void attach(Observer o){
        list.add(o);
    }
    public void detach(Observer o){
        list.remove(o);
    }
    public void Notify(){
        for(Observer o:list){
            o.update();
        }
    }
}

 


• 抽象观察者( Observer ) 角色:
• 为所有的具体观察者定义一个接口,在得到通知时更新自己;抽象观察者角色。

 

 

 

public abstract class Observer {
    abstract void update();
}

 


• 具体主题( ConcreteSubject ) 角色:
• 保存对具体观察者对象有用的内部状态;在这种内部状态改变时给其观察者发出一个通知;具体主题角色又叫作具体被观察者角色;

 

 

 

public class ConcreteSubject extends Subject {
    private String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

 


• 具体观察者( ConcreteObserver ) 角色:
• 保存一个指向具体主题对象的引用;和一个与主题的状态相符的状态。具体观察者角色实现抽象观察者角色所要求的更新自己的接口,以便使本身的状态与主题的状态自恰。

 

 

 

 

 

public class ConcreteObserver extends Observer {
    ConcreteSubject concreteSubject;
    String name;
    ConcreteObserver(ConcreteSubject concreteSubject,String name){
        this.concreteSubject=concreteSubject;
        this.name=name;
    }
    @Override
    void update() {
        System.out.println(name+"知道了"+concreteSubject.getMessage());
    }
}


测试:

 

 

public class Test {
    public static void main(String[] args) {
        ConcreteSubject s=new ConcreteSubject();
        s.attach(new ConcreteObserver(s,"MIKE"));
        s.attach(new ConcreteObserver(s,"NIKE"));
        s.attach(new ConcreteObserver(s,"TOM"));
        s.setMessage("mengmeng来了");
        s.Notify();
    }
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值