使用场景:

  • 聊天室程序的创建,服务器创建好后,A,B,C 三个客户端连上来公开聊天。A向服务器发送数据,服务器端聊天数据改变。我们希望将这些聊天数据分别给其他在线的客户。也就说,每个客户端都需要更新服务器得到数据。
  • 大家一起玩CS游戏时,服务器需要将每个人的方位变化发给所有的客户。

我们可以把多个订阅者,客户称之为观察者,需要同步给多个订阅者的数据封装到对象中,称之为目标。

观察者核心是:

  • 观察者模式主要用于 1:N 的通知,当一个对象(目标对象Subject或Objservable)的状态变化时,他需要及时告知一系列对象(观察者对象,Observice),令他们做出响应。

通知观察者的放式:

  • --  每次都会把通知以广播放式发送给所有的观察者,所有观察者只能被动接受。
  • --  观察者只要直到有情况即可。至于什么时候获取内容,获取什么内容,都可以自主决定。

 

1),创建主题对象如下

/**主题对象
 * @author 晓电脑
 */
public class Obsubject {
    /**
     *     创建保存观察者的集合
     */
    protected List<Observice> lists = new ArrayList<>();


    /**
     * 添加观察者方法
     * @param observice
     */
    public void addObservice(Observice observice){
        lists.add(observice);
    }

    /**
     * 获取当前观察者长度
     * @return
     */
    public int size(){
        return lists.size();
    }

    /**
     * 删除观察者方法
     * @param observice
     */
    public void removeObservice(Observice observice){
        lists.remove(observice);
    }

    /**
     * 通知所有观察者改变了状态
     */
    public void notifyObservice(){
        lists.stream().forEach(e->e.update(this));
    }

}

 

2),创建观察者接口,和它的实现类

/**
 * 观察者接口
 */
public interface Observice {
    void update(Obsubject obsubject);
}

/**
 * 创建观察者对象类
 */
class UserObservice implements Observice{

    private int myState;

    @Override
    public void update(Obsubject obsubject) {
        if (obsubject instanceof ConcreteObsubject){
            ConcreteObsubject concreteObsubject = (ConcreteObsubject) obsubject;
            myState = concreteObsubject.getState();
        }
    }

    public int myState(){
        return this.myState;
    }
}

 

3),创建主题对象的子类

/**创建观察者的实现类
 * @author 晓电脑
 */
public class ConcreteObsubject extends Obsubject {


    private int state;

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
        //改变所有观察者对象的state值
        this.notifyObservice();
    }
}

 

4),创建客户端进行测试

/**客户端进行测试  -- 观察模式-推送
 * @author 晓电脑
 */
public class Client {
    public static void main (String[] args) {

        // 创建多个观察者对象
        UserObservice observice1 = new UserObservice();
        UserObservice observice2 = new UserObservice();
        UserObservice observice3 = new UserObservice();

        //创建集合保存
        //创建发送者
        ConcreteObsubject obsubject = new ConcreteObsubject();
        obsubject.addObservice(observice1);
        obsubject.addObservice(observice2);
        obsubject.addObservice(observice3);

        int size = obsubject.size();
        System.out.println(size);


        //改变值
        obsubject.setState(1000);
        //查看观察者的值是否改变

        System.out.println(observice1.myState());
        System.out.println(observice2.myState());
        System.out.println(observice3.myState());
    }
}

 

运行效果:

Java设计模式学习-观察者模式

 

uml类图如下

                                                     Java设计模式学习-观察者模式

 

JavaSE提供了java.util.Observale和java.util.Observer是实现观察者模式

 

1),创建目标对象类需要继承java.util.Observable类

/**目标对象
 * @author 晓电脑
 */
public class ConcreteObsubject extends Observable {
    int state;

    public int getState() {
        return state;
    }

    public void setState(int state) {
        //目标对象的状态做了改变
        this.state = state;
        //表示目标状态发生了更改
        setChanged();
        //通知所有观察者
        notifyObservers(state);
    }
}

2),创建观察在对象,需要实现java.util.Observer类

/**创建观察者对象
 * @author 晓电脑
 */
public class ObserviceA implements Observer {
    
    int mystate;

    @Override
    public void update(Observable o, Object arg) {
        if (o instanceof ConcreteObsubject){
            ConcreteObsubject concreteObsubject = (ConcreteObsubject) o;
            mystate=concreteObsubject.getState();
        }
    }

    public int getMystate() {
        return mystate;
    }

}

3),创建客户端进行测试

/**测试观察者模式
 * @author 晓电脑
 */
public class Client {
    public static void main (String[] args) {
        //创建目标对象
        ConcreteObsubject concreteObsubject = new ConcreteObsubject();


        //创建观察者对象
        ObserviceA observiceA1 = new ObserviceA();
        ObserviceA observiceA2 = new ObserviceA();
        ObserviceA observiceA3 = new ObserviceA();

        concreteObsubject.addObserver(observiceA1);
        concreteObsubject.addObserver(observiceA2);
        concreteObsubject.addObserver(observiceA3);

        concreteObsubject.setState(3000);

        System.out.println(observiceA1.getMystate());
        System.out.println(observiceA2.getMystate());
        System.out.println(observiceA3.getMystate());
    }
}

 

运行结果和上面的结果是一样的,只是java底层帮我们做了。

 

开发中常见的场景:

  • 聊天室程序的,服务器转发给所有的客户端。
  • Servlet中,监听器的实现。
  • Android 中,广播事件。
  • JDK的AWT中事件处理模式,基于观察者模式的委派事件模式(Delegation Event Model)
  • 京东商城中,群发某商品打折信息。

 

相关文章:

  • 2021-08-05
  • 2021-04-15
  • 2021-09-28
  • 2021-08-05
  • 2021-10-04
  • 2021-08-05
  • 2018-03-24
猜你喜欢
  • 2021-09-30
  • 2018-09-15
  • 2021-06-13
  • 2021-11-09
  • 2021-12-18
  • 2021-09-30
  • 2021-08-05
  • 2018-03-26
相关资源
相似解决方案