观察者模式

观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。
观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。
下面是基础的逻辑代码,已经注释的很清楚了:就是一个用户操作的监听管理器,管理器监听用户行为,然后刷新想要刷新的依赖于它的对象。仔细看,代码很简单,理解很关键。
package com.ggr.observer;

import java.util.ArrayList;
import java.util.List;
/**
 * 事件监听管理规范
 * @author GG
 * 本来我是直接写一个管理器不想用接口的,但是老师说不同的业务场景通知的方式可能不一样,所以我将这个管理器抽象出来
 * 就是为了增加它的拓展性和灵活性,这也是面向对象真正的美丽之处吧。
 */
public interface Manager{
    
    //管理的事件集合
    public List<Observer> list = new ArrayList<>();
    
    //事件添加规范
    public void addObserver(Observer o);
    
    //事件添加规范
    public void removeObserver(Observer o);
    
    //通知刷新规范
    public void notifyAllSubject();
}
package com.ggr.observer;

/**
 * 
 * @author GG
 *自定义的事件管理器,它的刷新方式就是全部刷新
 */
public class MyManager implements Manager {

    @Override
    public void addObserver(Observer e) {
        list.add(e);
    }

    @Override
    public void removeObserver(Observer e) {
        list.remove(e);
    }

    @Override
    public void notifyAllSubject() {
        for (Observer observer : list) {
            observer.click();
        }
    }

}
package com.ggr.observer;
/**
 * 
 * @author GG
 *定义一个按钮实现点击规范
 */
public class MyButton implements Observer{

    public String name;
    public MyButton(String name){
        this.name = name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    
    @Override
    public void click() {
        System.out.println("按钮"+this.name+"事件触发");
    }

}
package com.ggr.observer;
/**
 * 
 * @author GG
 * 定义一个图片按钮,实现了点击事件的规范
 *
 */
public class MyImage implements Observer{

    MyImage(String name){
        this.name = name;
    }
    private String name;
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    
    /**
     * 点击事件规范的实现
     */
    @Override
    public void click() {
        System.out.println("图片"+this.name+"事件触发");
    }

}
package com.ggr.observer;
/**
 * 定义被观察者的规范,这里就是点击操作
 * @author GG
 *
 */
public interface Observer {
    void click();
}
package com.ggr.observer;

/**
 * 
 * @author GG
 * 测试
 *
 */
public class TestDao {
    public static void main(String[] args) {    
        
        System.out.println("------------------------------------------");
            
        Observer btn= new MyButton("login");
        Observer image = new MyImage("my.png");
        
        Manager photo = new MyManager();
        photo.addObserver(btn);
        photo.addObserver(image);    
        
        photo.notifyAllSubject();
        
    }
}