设计模式(五)观察者模式

观察者模式定义:在对象之间定义一对多的关系,当主对象改变状态,依赖它的对象都会收到通知,作出相应的改变。
这种模式在现实中比较常见:比方说,炒股的过程中,股票行情可以当做主对象,股票玩家就是模式中的观察者。当股票行情变化时,炒股者观察或者监听到行情的变化,就会作出买,卖的行为。
再比方说,有一个猎头,有一群求职者是他的客户,猎头从委托公司获取职位信息,一旦获取到新的职位需求,就会逐个通知他的客户,让他们准备去面试。猎头就是模式中的主对象,各个求职者组成模式中的观察者。
UML如下:


image.png

观察者模式中角色如下:
1、主体接口(HeadHunter),这个接口是主体类的抽象。一般,对观察者的添加,删除都在里面定义,包括状态更新后通知观察者的方法。
2、主体类(ConcreteHeadHunter),这个是主体接口的一个具体实现,主体类中会维护一个观察者的列表。主体类负责维护观察者的增,减和状态变更通知。
3、观察者接口(Observer),各种类型的观察者的一个抽象,用于规范所有观察者的共有行为。
4、具体的观察者类(FirstObserver、SecondObserver),主体类变化之后,会通知各个观察者,各个观察者更具变化执行自己的操作
代码如下:

/**
 * 模式中主体类的接口,观察者的维护和通知都在此处定义
 * @author saisaimayi
 *
 */
public interface HeadHunter {

    /**
     * 注册观察者
     * @param observer
     */
    public void registerObserver(Observer observer);
    
    /**
     * 删除观察者
     * @param observer
     */
    public void removeObserver(Observer observer);
    
    /**
     * 更新工作
     */
    public void updateJob();

    /**
     * 通知所有观察者
     */
    public void notifyObservers();
}

/**
 * 具体的主体类
 * @author saisaimayi
 *
 */
public class ConcreteHeadHunter implements HeadHunter {

    private List observerList = new ArrayList();
    
    public void registerObserver(Observer observer) {
        observerList.add(observer);
    }

    public void removeObserver(Observer observer) {
        observerList.remove(observer);
    }

    public void updateJob() {
        System.out.println("来了一个新工作,我要通知那些找工作的家伙...");
        notifyObservers();
    }

    public void notifyObservers() {
        //逐个通知观察者
        for (Observer observer : observerList) {
            observer.interview();
        }
    }
}

/**
 * 观察者接口,定义所有观察者的共用行为
 * @author saisaimayi
 *
 */
public interface Observer {
    
    public void setName(String name);
    /**
     * 参加面试
     */
    public void interview();

}

/**
 * 求职者一(观察者)
 * @author saisaimayi
 *
 */
public class FirstObserver implements Observer {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void interview() {
        System.out.println(name+" prepare to interview...");
    }
}

/**
 * 求职者二(观察者)
 * @author saisaimayi
 *
 */
public class SecondObserver implements Observer {
    private String name = "Frank";
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void interview() {
        System.out.println(name+" prepare to interview...");
    }
}

public class Client extends TestCase {

    public void test(){
        HeadHunter hunter = new ConcreteHeadHunter();
        Observer javadev = new FirstObserver();
        javadev.setName("Jack");
        Observer cdev = new SecondObserver();
        hunter.registerObserver(javadev);
        hunter.registerObserver(cdev);
        hunter.updateJob();
    }
}

你可能感兴趣的:(设计模式(五)观察者模式)