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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40646143/article/details/85526506

使用场景:

  • 聊天室程序的创建,服务器创建好后,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());
    }
}

运行效果:

uml类图如下

                                                     

猜你喜欢

转载自blog.csdn.net/qq_40646143/article/details/85526506