GOF23的一些总结(二十一)

来源:互联网 发布:酒店管理系统sql语句 编辑:程序博客网 时间:2024/05/22 01:56

观察者模式:
聊天室程序的创建:服务器创建好后,A,B,C三个客户端连接上来公开聊天。A向服务器发送数据,服务器端聊天数据改变。我们希望将这些聊天数据分别发给其他在线的客户。也就是说,每个客户端需要更新服务器端的数据。
多个观察者,客户称之为观察者。需要同步给多个订阅者的数据封装到对象中,称之为目标。
核心:N的通知,当一个对象(目标对象Subject或者Objservable)的状态变化时,他需要及时告知一系列对象(观察者对象,Observer),令他们做出响应。
这里写图片描述
目标对象的接口

package com.dasenlin.com;import java.util.ArrayList;import java.util.List;public class Subject {    protected List <Observer> list = new ArrayList<Observer>();    public void addObserverObject(Observer obs){           list.add(obs);    }     public void removeObserverObject(Observer obs){           list.remove(obs);    }    public void notifyAllObservers(){        for(Observer objs:list){            objs.update(this);        }    }}

目标对象变化时变化中的通知

package com.dasenlin.com;public class ConcreteSubject extends Subject {    private int state;    public int getState() {        return state;    }    public void setState(int state) {        this.state = state;        this.notifyAllObservers();//主体、目标对象发生变化的时候,所有的都发生了改变。    }}

观察者对象接口

package com.dasenlin.com;public interface Observer {    void update(Subject subject);}

观察者对象接口实现

package com.dasenlin.com;public class ObserverA implements Observer {    private int myState;    @Override    public void update(Subject subject) {        myState =((ConcreteSubject)subject).getState();//将目标转换为当前目标,并获得状态    }    public int getMyState() {          return myState;    }    public void setMyState(int myState) {        this.myState = myState;    }   }

测试

package com.dasenlin.com;public class Client {    public static void main(String[] args) {        //创建一个目标对象        ConcreteSubject subject = new ConcreteSubject();        //创建多个观察者        ObserverA obs1 = new ObserverA();        ObserverA obs2 = new ObserverA();        ObserverA obs3 = new ObserverA();        //将这3个观察者添加到subject对象的观察者队伍中        subject.addObserverObject(obs1);        subject.addObserverObject(obs2);        subject.addObserverObject(obs3);        //改变这里的目标对象的状态        subject.setState(30000);        //查看这里观察者的状态        System.out.println(obs1.getMyState());        System.out.println(obs2.getMyState());        System.out.println(obs3.getMyState());    }}
0 0
原创粉丝点击