Observer观察者模式

观察者模式是一种行为设计模式,应用比较广泛。他跟钩子函数、回调函数其实是一回事。

观察者的调用类图:

上面这种方式,没有抽象出单独的事件。还有一种方式,可以将事件单独抽象出来,观察者接收到事件之后,根据事件作出响应

示例代码:小孩哭的时候,爸爸哄哄,妈妈喂喂

public class Main {
    public static void main(String[] args) {
        //创建观察者的管理者类,并添加观察者
        ObserverManager obm = new ObserverManager();
        obm.add(new Dad()).add(new Mom());

        Child child1 = new Child("Tom", obm);
        child1.cry();

        Child child2 = new Child("Jack", obm);
        child2.cry();

    }
}

/**
 * 被观察者基类
 */
class Observed {
    public String name;
    public ObserverManager observerManager;
}

/**
 * 具体被观察者
 */
class Child extends Observed {

    public Child (String name, ObserverManager observerManager){
        this.name = name;
        this.observerManager = observerManager;
    }

    public void cry(){
        ActionEvent ae = new ActionEvent(this);
        observerManager.notify(ae);
    }
}

/**
 * 事件类
 */
class ActionEvent {
    private Observed observed;
    public ActionEvent(Observed observed){
        this.observed = observed;
    }
    public Observed getSource() {
        return observed;
    }
}

/**
 * 观察者的管理员类
 */
class ObserverManager{
    List<Observer> observers = new ArrayList<>();

    public ObserverManager add(Observer ob){
        observers.add(ob);
        return this;
    }

    public void notify(ActionEvent actionEvent){
        for(int i=0;i<observers.size();i++){
            observers.get(i).doAction(actionEvent);
        }
    }
}

/**
 * 通用观察者接口
 */
interface Observer {
    void doAction(ActionEvent actionEvent);
}

/**
 * 具体观察者dad
 */
class Dad implements Observer{
    @Override
    public void doAction(ActionEvent actionEvent) {
        System.out.println(actionEvent.getSource().name+"爸爸哄哄");
    }
}
/**
 * 具体观察者mom
 */
class Mom implements Observer{
    @Override
    public void doAction(ActionEvent actionEvent) {
        System.out.println(actionEvent.getSource().name+"妈妈喂喂");
    }
}

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值