观察者模式(observer)

我的看法

    • 其实现方式实际上为观察者定义统一的接口,便于主题的通知,而主题内维护了一个观察者列表,在列表上的观察者,主题发生变化的时候会遍历通知
    • 实质上    观察者模式=出版者+订阅者(即被观察的主题发生变化会通知观察者)

 

应用场景

             订阅号

             swing组件的监听器

             天气预报平台等

 

其中用到的设计原则

 

  • 针对接口编程,而不针对实现

主题通过接口通知观察者,观察者的注册也是通过接口

  • 多用组合,少用继承

对象之间的关系并没有使用继承,而是运行中通过组合产生

  • 为交互对象设计松耦合

利用观察者模式我们将主题与观察者之间的耦合降低,在后期的维护和代码

复用都很方便,这样设计的系统更加有弹性

 

优点

 

使对象间的关系实现了松耦合,所以一边程序的变化不会影响另一边

 

主要组成

 

    •  

抽象主题

添加了对观察者列表维护的方法和通知的方法

具体主题

维护了一个观察者列表,并实现对观察者的通知

抽象观察者

所有观察者的抽象接口

具体观察者

实现了统一接口,并有收到通知的方法

 

类图

 

 

下面是我程序的类图

 

 

抽象主

package observer_02;


public interface GirlSubject {

    public void notifyBoy(String message);

    public void deleteBoy(Object ob);

    public void addBoy(Object ob);

}

 

具体主题(女孩)

package observer_02;


import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;


public class ContreteGirlSubject implements GirlSubject {

    List observerList = new ArrayList();//观察者列表


    public void notifyBoy(String message) {//发生变化时通知观察者

        for (Iterator iterator = observerList.iterator(); iterator.hasNext();) {

            BoyObserver boy = (BoyObserver) iterator.next();

            boy.messDisplay(message);

        }

    }


    public void deleteBoy(Object ob) {

        int i = observerList.indexOf(ob);

        if (i > 0)

            observerList.remove(i);

    }


    public void addBoy(Object ob) {

        observerList.add(ob);

    }


}

 

抽象观察者

package observer_02;


public interface BoyObserver {

    public void messDisplay(String message);

}

 

具体观察者(追求者A)

package observer_02;


public class HunterBoy implements BoyObserver {

    private GirlSubject girlSubject;


    public HunterBoy(GirlSubject girlSubject) {

        this.girlSubject = girlSubject;

        girlSubject.addBoy(this);//在初始化的时候将观察者注册进观察者列表
    
    }


    public void messDisplay(String message) {

        System.out.println("HunterBoy is reading  " + message);

    }


}

 

具体观察者(追求者B)

package observer_02;


public class PursuerBoy implements BoyObserver {

    GirlSubject girlSubject;


    public PursuerBoy(GirlSubject girlSubject) {

        this.girlSubject = girlSubject;

        girlSubject.addBoy(this);
    
    }


    public void messDisplay(String message) {

        System.out.println("PursuerBoy is reading  " + message);

    }


}

 

测试类

package observer_02;


public class Client {

    public static void main(String[] args) {

        GirlSubject girlSubject = new ContreteGirlSubject();

        BoyObserver boy1 = new HunterBoy(girlSubject);

        BoyObserver boy2 = new PursuerBoy(girlSubject);

        girlSubject.notifyBoy("good day");

    }

}

 

输出结果

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值