设计模式笔记(17)--观察者模式

观察者模式

GOF对观察者模式的定义是:“观察者模式定义了一种多对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生改变时,会通知所有观察者对象,使他们能够自动更新自己。”

接下来上代码,以间谍为例

package Observer;

public abstract class Country {
    protected String countryName;
    protected Spy spy;
    
    public Country(String countryName,Spy spy)
    {
        this.countryName = countryName;
        this.spy = spy;
    }
    
    public abstract void Update();
}
package Observer;

public class CountryA extends Country{
    
    public CountryA(String countryName,Spy spy)
    {
        super(countryName,spy);
    }

    @Override
    public void Update() {
        // TODO Auto-generated method stub
        System.out.println(countryName+"得到"+spy.spyName+"的情报:"+
        spy.getIntelligence()+"决定与甲国建交");
    }
}
package Observer;

public class CountryB extends Country{
    public CountryB(String countryName,Spy spy)
    {
        super(countryName,spy);
    }

    @Override
    public void Update() {
        // TODO Auto-generated method stub
        System.out.println(countryName+"得到"+spy.spyName+"的情报:"+
        spy.getIntelligence()+"决定与甲国开战");
    }
}
package Observer;

import java.util.ArrayList;

public abstract class Spy {
    private ArrayList countries = new ArrayList();
    private String intelligence;
    public String spyName;
    
    public void Attach(Country country)
    {
        countries.add(country);
    }
    
    public void Detach(Country country)
    {
        countries.remove(country);
    }
    
    public void Notify()
    {
        //Syntactic sugar
        for(Country c : countries){
            ((Country) c).Update();
        }
    }
    
    public void setIntelligence(String intelligence)
    {
        this.intelligence = intelligence;
    }
    
    public String getIntelligence()
    {
        return intelligence;
    }
}
package Observer;

public class Spy007 extends Spy{
    public Spy007()
    {
        spyName = "007";
    }
}
package Observer;

public class Mole extends Spy{
    public Mole()
    {
        this.spyName = "甲国的内奸";
    }
}
package Observer;

public class client {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Spy spy007 = new Spy007();
        Country ca = new CountryA("乙国",spy007);
        Country cb = new CountryB("丙国",spy007);
        spy007.Attach(ca);
        spy007.Attach(cb);
        spy007.setIntelligence("甲国研制了核武器!");
        spy007.Notify();
    }
}
设计模式笔记(17)--观察者模式_第1张图片

观察者模式适用于以下几个情况:

  1. 当一个抽象模型有两个方面,其中一个方面必须依赖于另一个方面时
  2. 当一个对象的改变需要同时改变其它的对象,但是不知道具体有多少个对象等待改变时。
  3. 当一个对象必须通知其他对象但是却不能与其他对象造成紧密耦合时。

你可能感兴趣的:(设计模式笔记(17)--观察者模式)