观察者模式

百度百科


观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。


观察者抽象类


//抽象的报纸订阅者
public abstract class Subscribers {

    //提供一个方法,供观察者调用,更新状态
    //比如提供一个信箱,把报纸放进去
    public abstract void update(String state);

}

订阅者A

public class SubscribersA extends Subscribers{

    @Override
    public void update(String state) {
        System.out.println("报纸更新了,内容:" + state);
    }
}

订阅者B

public class SubscribersB extends Subscribers{
    @Override
    public void update(String state) {
        System.out.println("报纸更新了,内容:" + state);
    }
}

报纸抽象类(被观察者)

public abstract class Newspaper {

    //哪些人订阅了报纸
    protected List<Subscribers> subscribers = new ArrayList<>();

    //添加到订阅者列表中
    public void add(Subscribers subscriber) {
        subscribers.add(subscriber);
    }

    //取消订阅
    public void delete(Subscribers subscriber) {
        subscribers.remove(subscriber);
    }

    //通知订阅者,报纸更新了
    public void notifySubscribers(String content) {
        for (Subscribers subscriber : subscribers) {
            subscriber.update(content);
        }
    }

}

客户端

public class Main {
    public static void main(String[] args) {
        Newspaper xinhua = new XinhuaDaily();
        Subscribers a = new SubscribersA();
        Subscribers b = new SubscribersB();
        xinhua.add(a);
        xinhua.add(b);
        xinhua.notifySubscribers("2018来了");
    }
}

Observable是java实现观察者模式的一种方式,被观察者需要继承Observable,观察者实现Observer接口。

被观察者

//学生,被观察者,继承Observable(可以被观察的)
public class Student extends Observable {

    public void study(){
        System.out.println("学生:1+1=几");
        setChanged();                  //只有调用setChanged()方法和并通知观察者notifyObservers(),观察者才会解释到通知,调用观察者内部update()方法
        notifyObservers();
    }
}

观察者

//观察者内部必须重写update()方法
public class Teacher implements Observer{

    @Override
    public void update(Observable observable, Object object) {
        //observable,被观察者可以直接把自己传递给观察者
        //object,被观察者可以传递对象给观察者
        System.out.println("老师:2");
    }
}

测试类

public class Test {
    public static void main(String[] args) {
        Student student = new Student();  //创建一个被观察者
        Teacher teacher = new Teacher();  //创建一个观察者
        student.addObserver(teacher);     //把被观察者添加到观察者所观察的集合中
        student.study();
    }
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值