美文网首页
观察者模式

观察者模式

作者: 古早味蛋糕 | 来源:发表于2022-12-01 18:08 被阅读0次

    观察者模式,包括观察者和被观察者。观察者们将自己的需求告知被观察者,被观察者负责通知到观察者。

    一、Java自带的观察者
    1. Server

    Server可以理解为被观察者,用来通知所有的Client。

        public class Server extends Observable {
            private int time;
        
            public Server(int time) {
                this.time = time;
            }
        
            public void setTime(int time) {
                if (this.time == time) {
                    setChanged();//一定要标注, 表明有数据变更, 需要通知观察者
                    notifyObservers(time);
                }
            }
        }
    
    2. Client

    Client是观察者,通过实现Observer接口来接收Server发送的通知。

        public class Client implements Observer {
            private String name;
        
            public Client(String name) {
                this.name = name;
            }
        
            @Override
            public void update(Observable o, Object arg) {
                if (o instanceof Server) {
                    ToastUtil.showToast(name + "say: time is up!" + arg);
                }
            }
        }
    
    3. 使用方法
        Server server = new Server(2019);
        Client client1 = new Client("张三");
        Client client2 = new Client("李四");
        server.addObserver(client1);
        server.addObserver(client2);
        server.setTime(2018);
        server.setTime(2019);
    

    注意,不需要观察者的时候需要移除观察者,例如在onDestroy的时候:

        @Override
        protected void initDestroy() {
            if (server != null) {
                server.deleteObservers();
            }
        }
    
    二、自己实现观察者模式

    对于一个被观察者,我们希望在任何地方都能添加观察者,可以使用静态变量的方式简单地实现:

        public class MyObservable {
        
            private static Vector<MyObserver> observers = new Vector<>(); //用Vector考虑线程安全
        
            public static void addObserver(MyObserver myObserver) {
                observers.add(myObserver);
            }
        
            public static void removeObserver(MyObserver myObserver) {
                observers.remove(myObserver);
            }
        
            public interface MyObserver {
                void update(int time);
            }
        
            public static void notify(int time) {
                for (MyObserver observer : observers) {
                    observer.update(time);
                }
            }
        }
    

    进行使用:

        //创建观察者
        MyObservable.MyObserver myObserver = new MyObservable.MyObserver() {
            @Override
            public void update(int time) {
                ToastUtil.showToast("here is myObserver!");
            }
        };
        //将观察者添加到被观察者中
        MyObservable.addObserver(myObserver);
            //通知
            MyObservable.notify(2020);
        //移除
        @Override
        protected void initDestroy(){
            if(myObserver!=null){
                MyObservable.removeObserver(myObserver);
            }
        }
    

    相关文章

      网友评论

          本文标题:观察者模式

          本文链接:https://www.haomeiwen.com/subject/tuhrfdtx.html