二十四中设计模式之:观察者模式

观察者模式的思想很简单,但是确实很实用。

理解

  • 就拿期刊来说,我很喜欢一个期刊,会每天都要去报刊亭询问老板有没有。有的话就买,没有则离开。这种做法不仅浪费时间,而且老板都会对你感到厌烦。
  • 但是有一天我发现了一种不用每天都要绕一大段路,再也不用看老板的白眼的办法了。那就是订阅,直接在邮局进行订阅,如果有就给我送来(或通知我去拿)。省时省力呀,有木有。
  • 其实观察者模式就是跟报刊订阅差不多。

下面是根据我自个的理解写出来的demo,如有错误,请告诉我。万分感谢!

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

/**
 * @author clan
 * @function 二十四中设计模式之:观察者模式
 * @date 2017/12/11.
 */
public class MyObservice {
    public Subject subject;

    public MyObservice() {
        subject = new Subject();
    }

    public void action() {
//      开始用户登陆/认证
        subject.login();
        subject.auth();
//      通知观察者队列中的观察者
        subject.notifyObservers();
    }

    public static void main(String[] args) {
        MyObservice myObservice = new MyObservice();
//      将想要监听登陆/认证成功的对象,添加到要通知的观察者队列
        myObservice.subject.addObserver(new UserAction());
        myObservice.subject.addObserver(new Observer() {
            @Override
            public void update(Observable o, Object arg) {
                System.out.println("监听对象2:登陆并认证成功了");
            }
        });

        //开始登陆/认证
        myObservice.action();
    }
}

/**
 * 被观察者 可以是登陆,用户认证之类的
 */
class Subject extends Observable {

    public void login() {
        System.out.println("登陆");
    }

    public void auth() {
        System.out.println("认证");
    }
}

/**
 * 监听对象
 */
class UserAction implements Observer {
    /**
     * 当被观察者更新时,会调用这个方法
     *
     * @param o   被观察者
     * @param arg 参数
     */
    @Override
    public void update(Observable o, Object arg) {
        System.out.println("监听对象1:登陆并认证成功了");
    }
}

class Observable {
    private List<Observer> list = new ArrayList<Observer>();

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

    public void notifyObservers() {
        Iterator iterator = list.iterator();
        while (iterator.hasNext()) {
            Observer o = (Observer) iterator.next();
            o.update(this, null);
        }
    }
}

interface Observer {
    public void update(Observable o, Object arg);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值