java设计模式-观察者模式

 

本着以刚入门者更容易明白的角度来谈观察者模式

观察者模式的作用是什么呢?是为了实现一者改变,另外多者跟随改变的作用。

观察者模式需要什么呢?

1.抽象被观察者角色:也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。

2.抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。

3.具体被观察者角色:也就是一个具体的主题,在集体主题的内部状态改变时,所有登记过的观察者发出通知。

4.具体观察者角色:实现抽象观察者角色所需要的更新接口,一边使本身的状态与制图的状态相协调。

 

show the easy code .

       抽象被观察者,提供了三个接口方法,registerObserver用来提供注册订阅,removeObserver用来提供解除订阅,notify用来通知改变,即推送。

public interface Observable{


     void registerObserver(Observer observer);


     void removeObserver(Observer observer);

    
     void notify();

}

 抽象观察者接口,提供接口方法update来进行数据更新。

public class Observer{


    void  update(String message);


}

这里提供服务的方法拥有一个Observer的集合,来装注册了该服务的Observer,来实现通知改变的效果, 

public class WatchServer implements Observerable {
    
    
    private List list;
    private String message;
    
    public WechatServer() {
        list = new ArrayList();
    }
    
    @Override
    public void registerObserver(Observer o) {
        
        list.add(o);
    }
    
    @Override
    public void removeObserver(Observer o) {
        if(!list.isEmpty())
            list.remove(o);
    }

    //遍历
    @Override
    public void notifyObserver() {
        for(int i = 0; i < list.size(); i++) {
            Observer oserver = list.get(i);
            oserver.update(message);
        }
    }
    
    public void setInfomation(String messeage) {
        this.message = messeage;
        System.out.println("服务更新消息: " + messeage);
        //消息更新,通知所有观察者
        notifyObserver();
    }

}

具体的观察者实现抽象观察者接口的方法,来达到更新数据的效果 

public class TestUser implements Observer {

    private String name;
    private String message;
    
    public User(String name) {
        this.name = name;
    }
    
    @Override
    public void update(String message) {
        this.message = message;
        read();
    }
    
    public void read() {
        System.out.println(name + " 收到推送消息: " + message);
    }
    
}

测试用例。 

public class Test {
    
    public static void main(String[] args) {
        WechatServer server = new WechatServer();
        
        Observer userMM = new User("MM");
        Observer userGG = new User("GG");
        Observer userHH = new User("HH");
        
        server.registerObserver(userMM );
        server.registerObserver(userLi);
        server.registerObserver(userHH );
        server.setInfomation("测试效果1!");
        
        System.out.println("----------------------------------------------");
        server.removeObserver(userMM );
        server.setInfomation("测试效果2!");
        
    }
}

这样实现了一个简单的观察者模式设计,注意观察者模式是面对接口编程,而不是面对实现编程! 

 

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