Java设计模式之观察者模式

Java23种设计模式

定义:一个对象发生改变,订阅他的对象也随着跟着改变,不需要在乎互相之间是如何改变的。

观察者模式分为:

  1. 多个观察一个,比方说课堂上老师讲课同时多个人可以听到。
  2. 一个观察多个,比方说考场上多个考生一个监考老师。

第一个例子:多个观察者对一个被观察者:

  1. 观察者为学生,学生的动作为听课:
//观察者
public interface Observer {
    void listen(String msg);
}
  1. 被观察者为老师,老师的动作为讲课,并且观察者(学生)要注册登记到老师的名单内。
//被观察者
public interface Observable {
    void add(Observer obs);
    void teach(String msg);
}
  1. 创建教师对象,教师有固定的上课学生名单
public class Teacher implements Observable{
    List<Observer> list = new ArrayList<>();
    @Override
    public void add(Observer obs) {
        list.add(obs);
    }

    @Override
    public void teach(String msg) {
        for(Observer obs:list){
            obs.listen(msg);
        }
    }
}
  1. 创建多个学生对象,学生接收老师教的知识并打印出来。
public class Xiaoming implements Observer{
    @Override
    public void listen(String msg) {
        System.out.print("小明收到消息:"+msg);
    }
}
public class XiaoLi implements Observer{
    @Override
    public void listen(String msg) {
        System.out.print("小丽收到消息:"+msg);
    }
}
public class Jack implements Observer{
    @Override
    public void listen(String msg) {
        System.out.print("Jack收到消息:"+msg);
    }
}
  1. 创建教室,配置教学环境
public class Study {
    public static void main(String[] args) {
        Teacher teacher = new Teacher();
        teacher.add(new Xiaoming());
        teacher.add(new Jack());
        teacher.add(new XiaoLi());

        teacher.teach("大家要好好学习天天向上!\n");
        teacher.teach("告诉大家1+1=2\n");
    }
}
  1. 查看学生学到的信息,看效果。
小明收到消息:大家要好好学习天天向上!
Jack收到消息:大家要好好学习天天向上!
小丽收到消息:大家要好好学习天天向上!
小明收到消息:告诉大家1+1=2
Jack收到消息:告诉大家1+1=2
小丽收到消息:告诉大家1+1=2

第二个例子:一个观察者对多个被观察者:

  1. 观察者为老师,老师只有一个动作,作弊记录下来。
//观察者
public interface Observer {
    void whoZuobi(String name);
}
  1. 被观察者为学生,学生从入考场时候就有固定的监考老师,并且有可能有作弊的动作。
//被观察者
public abstract class Observable {
    Observer observable;
    void subscribe(Observer obs){
        this.observable = obs;
    }
    abstract void zuobi();
}
  1. 创建老师实体类
public class Teacher implements Observer{
    @Override
    public void whoZuobi(String name) {
        System.out.print(name+"作弊,记过一次!\n");
    }
}
  1. 创建被观察者学生类
public class Xiaoming extends Observable{
    @Override
    void zuobi() {
        observable.whoZuobi("小明");
    }
}
public class XiaoLi extends Observable{
    @Override
    void zuobi() {
        observable.whoZuobi("小丽");
    }
}
public class Jack extends Observable{
    @Override
    void zuobi() {
        observable.whoZuobi("Jack");
    }
}
  1. 搭建考试环境
public class Examination {
    public static void main(String[] args) {
        Teacher teacher = new Teacher();
        Xiaoming xiaoming = new Xiaoming();
        XiaoLi xiaoLi = new XiaoLi();
        Jack jack = new Jack();

        xiaoming.subscribe(teacher);
        xiaoLi.subscribe(teacher);
        jack.subscribe(teacher);

        xiaoming.zuobi();
        jack.zuobi();
        xiaoming.zuobi();
        xiaoming.zuobi();
        xiaoming.zuobi();
    }
}
  1. 运行结果:
小明作弊,记过一次!
Jack作弊,记过一次!
小明作弊,记过一次!
小明作弊,记过一次!
小明作弊,记过一次!

通过如上两个例子可以看出来,观察者模式必须保证的要素是:

  1. 最少一个观察者和一个被观察者
  2. 观察者需在被观察者处订阅
  3. 被观察者有发出通知的行为
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值