A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

观察者模式具体定义是一对多的依赖关系而存在的.一个以上观察者监听同一个topic.这么说,当观察者状态改变理论上是需要通知其他观察者,使之联动更新


观察者的图解

在被观察者类中需要有一个集合维护所有观察者。

subject (被观察的对象接口) 属于concretesubject的统一接口,每个subject可以有多个observer
concretesubject(被观察对象) 维护对所有观察者引用的列表 状态改变时候就会送通知到注册的观察者
observer(观察者接口)规定concreteobserver的统一接口,定义update方法 当被观察者状态改变就调用
concreteobserver(具体观察者)维护一个对concretesubject的引用,特定状态跟concretesubjext同步,实现obsercer接口和update方法调用
重点:一旦检测到subject变动就更新信息

自己定义接口或者类来实现观察者模式
定义被观察者所具有的接口
public interface Observable {
    //注册为一个观察者   
    public void registerObserver(Observer observer);
   
    //取消观察者   
    public void removeObserver(Observer observer);
   
    //通知所有观察者更新信息   
    public void notifyObservers();
}

定义具体的被观察者:杯子
public class Cup implements Observable{
    //被观察者维护的一个观察者对象列表
    private Vector<Observer> vector = new Vector<Observer>();
    private float price;
   
    public Cup(float price){
        this.price = price;
    }
   
    public float getPrice() {
        return price;
    }
    public void setPrice(float price) {
        //修改价格时,通知所有观察者
        this.price = price;
        notifyObservers();
    }
    @Override
    public void registerObserver(Observer observer) {
        //注册观察者
        vector.add(observer);
    }
    @Override
    public void removeObserver(Observer observer) {
        //取消观察者
        vector.remove(observer);
    }
    @Override
    public void notifyObservers() {
        //实现通知所有的观察者对象
        for (Observer observer:vector) {
            observer.update(price);
        }
    }
}

定义观察者所具有的共同的接口
public interface Observer { public void update(float price);}
public class Person implements Observer{
    private String name;
    public Person(String name){
        this.name = name;
    }
    @Override
    public void update(float price) {
        System.out.println(name+"关注的杯子的价格已更新为:"+price);
    }
}
public static void main(String[] args) {
        //创建一个被观察者对象
        Cup doll  = new Cup(3000);
        //创建两个观察者对象
        Person p1 = new Person("健力宝1");
        Person p2 = new Person("健力宝2");
        //注册成为一个观察者
        doll.registerObserver(p1);
        doll.registerObserver(p2);

        System.out.println("第一轮促销:");
        doll.setPrice(2698);// 价格变动
        System.out.println("第二轮促销:");
        doll.setPrice(2299);//
        System.out.println("第三轮促销:");
        doll.setPrice(1998);

        doll.removeObserver(p2);    //将生命二号移除
        System.out.println("第四轮促销:");
        doll.setPrice(1098);        

    }
输出的结果是
第一轮促销:
健力宝1关注的杯子的价格已更新为:2689.0
健力宝2关注的杯子的价格已更新为:2689.0
第二轮促销:
健力宝1关注的杯子的价格已更新为:2299.0
健力宝2关注的杯子的价格已更新为:2299.0

第三轮促销:
健力宝1关注的杯子的价格已更新为:1998.0
健力宝2关注的杯子的价格已更新为:1998.0

第四轮促销:
健力宝1关注的杯子的价格已更新为:1098.0
总结


观察者模式:被观察与观察者之间存在抽象耦合关系.被观察所知道的是一个具体的观察者列表


应用场景:

三个条件:观察者 被观察,话题订阅
按上述说的关系,实际应用最广泛显然可见就是 公众号推送消息,独立的微信号关注多个公众号 ,每次总能收到公众号发部的更新内容
订阅号也会将公众号置顶标红提醒.
这就是典型的观察者模式.
一个或者多个公众号视为被观察者,用户微信则为订阅话题与被观察者建立一对多关系.自然用户就是属于观察者了





1 个回复

倒序浏览
香港作为世界三大金融中心之一,经济形势已经经过爆发式发展的时期,如今的香港,经济贸易依然处于领先位置,并且在不断地平稳发展。而之所以有那么多人认为香港的经济形势不乐观,主要是因为近几年国内的发展势头太过迅猛,尤其是房地产这一块,两相对比之下,香港平稳的发展才不那么显眼。为吸引相关世界各地人才来港,我们将通过“优秀人才入境计划”按现时年度1000的配额,为人才清单下合资格人士提供入境便利。在“优秀人才入境计划”下,获批准的申请者无须在来港定居前先获得本地僱主聘任。符合人才清单相关专业资格的申请者,可在“优秀人才入境计划”的“综合计分制”下获得额外分数。香港公布人才清单,多项优惠就等你来!香港优才计划申请条件评估网址(http://www.galaxy-immi.com/obscure/assessment/1.html?pla=sq&spreadword=heim)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马