观察者模式 -电脑资料

电脑资料 时间:2019-01-01 我要投稿
【www.unjs.com - 电脑资料】

    《Head First Design Pattern》一书中对观察者模式的定义如下:

    The Observer Pattern defines a one-to-many dependency objects so that when one object changes state, all of its dependents are notified and updated automatically.

    观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新,

观察者模式

    从根本上说,该模式必须包含两个角色:观察者和被观察对象。下面是设计模式中包含角色的UML类图(来自百度百科)。

   

    观察者<喎?http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPqOoT2JzZXJ2ZXKjqb2r19S8uteisuG1vbG7uduy7LbUz/OjqFN1YmplY3SjqdbQo6yxu7nbsuy21M/zvau527Ls1d+05rfF1NrSu7j2yN3G96OoQ29udGFpbmVyo6nA76GjPGJyIC8+DQo8c3Ryb25nPrG7uduy7Dwvc3Ryb25nPrbUz/OjqFN1YmplY3SjqbeiyfrBy8Sz1tax5Luvo6y008jdxvfW0LXDtb3L+dPQ16Ky4bn9tcS527Ls1d+jrL2rseS7r82o1qq527Ls1d+hozwvcD4NCjxwPs/Cw+a+2dXi0fnSu7j2wP3X06O6scjI59K7uPbQodPOz7ejrEHLtbP20ru49squvfjWxrXEyv2jrELLtbP2xuS21NOmtcS2/r341sa94bn7o6xDy7Wz9sbkttTTprXEsMu9+NbGveG5+6OsRMu1s/bG5LbU06a1xMquwfm9+NbGveG5+6GjPGJyIC8+DQrKudPDuduy7NXfxKPKvUG/ydLU1/fOqrG7uduy7NXfo6hTdWJqZWN0o6mjrEKhokOhokS/ydLU1/fOqrnbsuzV36OoT2JzZXJ2ZXKjqaGjPC9wPg0KPHA+z8LD5srHSmF2YbT6wuvKvsD9o7o8YnIgLz4NCjxzdHJvbmc+uduy7NXfvdO/2qO6PC9zdHJvbmc+PC9wPg0KPHByZSBjbGFzcz0="brush:java;">public interface IObserver { public void update();}

    被观察者接口:

<code class="hljs cs">public interface ISubject {    public void addObserver(IObserver o);    public void deleteObserver(IObserver o);    public void notifyObservers();}</code>

    实体被观察者A:就是游戏中的A

<code class="hljs java">public class Number implements ISubject {    private List<iobserver>observers;    private int number;    public Number() {        bservers = new ArrayList<iobserver>();    }    public void setNumber(int number) {        this.number = number;        notifyObservers();    }    public int getNumber() {        return number;    }    @Override    public void addObserver(IObserver o) {        observers.add(o);    }    @Override    public void deleteObserver(IObserver o) {        observers.remove(o);    }    @Override    public void notifyObservers() {        for (IObserver observer : observers) {            observer.update();        }    }}</iobserver></iobserver></code>

    实体观察者B:游戏中的B,将A给的数字转成二进制

<code class="hljs java">public class BinTranslator implements IObserver {    private ISubject subject;    public BinTranslator(Number number) {        subject = number;        subject.addObserver(this);    }    @Override    public void update() {        if (subject instanceof Number) {            Number number = (Number) subject;            int inum = number.getNumber();            System.out.println(inum + "=" + Integer.toBinaryString(inum));        }    }}</code>

    实体观察者D:游戏中的D,将A给的数字转成十六进制

<code class="hljs java">public class HexTranslator implements IObserver {    private ISubject subject;    public HexTranslator(Number number) {        subject = number;        subject.addObserver(this);    }    @Override    public void update() {        if (subject instanceof Number) {            Number number = (Number) subject;            int inum = number.getNumber();            System.out.println(inum + "=0x" + Integer.toHexString(inum));        }    }}</code>

    观察者模式测试代码:我们开始做游戏了

<code class="hljs cs">public class ObserverPattern {    @SuppressWarnings("unused")    public static void main(String[] args) {        Number number = new Number();        IObserver bin = new BinTranslator(number);        IObserver hex = new HexTranslator(number);        number.setNumber(12);        number.setNumber(-1);    }}</code>

    运行结果:

<code class="hljs ini">12=110012=0xc-1=11111111111111111111111111111111-1=0xffffffff</code>

    其实Java JDK本身提供了设计模式等额实现:

    java.util.Observer是一个接口,观察者接口,相当于我们上面的IObserver接口,

电脑资料

观察者模式》(https://www.unjs.com)。我们需要实现一个观察者的时候只需要实现这个接口就OK了。

    java.util.Observable是一个类,被观察者类,我们需要实现一个被观察者的时候只需要继承这个类就OK了。

最新文章