java设计模式-20观察者模式

定义

  • 对象之间多对一依赖的一种设计方案,依赖它的对象为被通知并更新信息
  • 其实就是发布订阅功能,订阅了就有消息了
  • 这个模式是松偶合的。改变主题或观察者中的一方,另一方不会受到影像。

该模式包含四个角色

  • 抽象被观察者角色:也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
  • 抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
  • 具体被观察者角色:也就是一个具体的主题,在集体主题的内部状态改变时,所有登记过的观察者发出通知。
  • 具体观察者角色:实现抽象观察者角色所需要的更新接口,一边使本身的状态与制图的状态相协调。

代码

  • 以收邮件为例

import java.util.ArrayList;
import java.util.List;

public class test14 {
    public static void main(String[] args) {
        MailServer mailServer =new MailServer();
        //整两个用户
        Observer observer1 =  new User("小黄");
        Observer observer2 =  new User("小青");
        //注册一下
        mailServer.add(observer1);
        mailServer.add(observer2);
        //发个消息
        mailServer.setInfomation("小青即将升职。。。。");
        System.out.println("======================");
        //删除一个用户
        mailServer.remove(observer1);
        mailServer.setInfomation("小青交接完成");
/* 邮箱来消息了:小青即将升职。。。。
        小黄 收到邮件内容 小青即将升职。。。。
        小青 收到邮件内容 小青即将升职。。。。
        ======================
        邮箱来消息了:小青交接完成
        小青 收到邮件内容 小青交接完成*/

    }
}

//被观察者接口
interface Observerable {

    //增加
    void add(Observer o);

    //删除
    void remove(Observer o);

    //通知
    void notice();
}

/**
 * 观察者
 * 定义了一个update()方法,当被观察者调用notifyObservers()方法时,观察者的update()方法会被回调。
 */
interface Observer {
    void update(String message);
}

//被观察者,实现邮箱服务
class MailServer implements Observerable {

    List<Observer> list = null;
    String message = null;

    public MailServer() {
        list = new ArrayList<>();
    }

    @Override
    public void add(Observer o) {
        list.add(o);
    }

    @Override
    public void remove(Observer o) {
        list.remove(o);
    }

    @Override
    public void notice() {
        for (Observer observer : list) {
            observer.update(message);
        }
    }

    void setInfomation(String s){
        this.message=s;
        System.out.println("邮箱来消息了:"+s);
        //消息来了通知一下
        notice();
    }
}
//用户类
class User implements Observer{
    private String name;
    private String message;

    public User(String name){
        this.name=name;
    }

    @Override
    public void update(String message) {
        this.message=message;
        System.out.println(name+" 收到邮件内容 "+message);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员黄小青

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值