簡單入門觀察者模式

觀察者模式一般是用於消息的推廣發送。直白一點,就是一個發消息的,一羣接收消息的。

發消息的我們定爲Role,接收消息的我們定爲People。爲了更好的擴展,我們定義一個接口角色Roles,用於管理接受消息的人和發消息,Role實現這個接口

interface Roles{
        void addPeople(People people);
        void removePeople(People people);
        void tellPeople(List<People> peopleList);
    }

一個發消息的機構繼承Roles

class Role implements Roles{

        List<People> peopleList = new ArrayList<>();

        public String msg;

        public void setMsg(String msg){
            this.msg = msg;
            tellPeople(peopleList);
        }

        @Override
        public void addPeople(People people) {
            peopleList.add(people);
        }

        @Override
        public void removePeople(People people) {
            int index = peopleList.indexOf(people);
            if(index>0)
                peopleList.remove(index);
        }

        @Override
        public void tellPeople(List<People> peopleList) {
            for (People peo:peopleList) {
                peo.listen(msg);
            }
        }
    }

這裏實現了添加接收消息的人,刪除接收消息的人,發送消息給所有人(tellPeople);

一個機構發消息,一定要傳遞消息或者其他信息到接收消息的人那裏。而這個消息就是msg,這裏暫定爲String格式。

一個機構一般會有一個讓接收消息的人實現的接口,也就是“聽到”消息。

 interface Listen{
        void listen(String msg);
    }

想要收到這個消息,就要實現這個方法,如果用戶爲People:

class People implements Listen{

        public String msg;
                    
        public People(Roles role){
            role.addPeople(this);
        }


        @Override
        public void listen(String msg) {
            System.out.println("消息消費了:"+msg);
        }
    }

接收消息的人肯定要有一個消息的格式Sring msg  ;然後把自己加到發消息的機構Role中的List中,這樣就可以接受到消息了。

其實,Roles中的list最好也修改爲List<Listen>,這樣更容易擴展下。下面是修改後的代碼:

public class TellModel {

    public static void main(String[] args) {

        Role role = new Role();
        People people = new People(role);
        role.setMsg("消息消費了哦!");

    }

    interface Roles{
        void addPeople(People people);
        void removePeople(People people);
        void tellPeople(List<Listen> listenList);
    }

    static class Role implements Roles{

        List<Listen> ltList = new ArrayList<>();

        public String msg;

        public void setMsg(String msg){
            this.msg = msg;
            tellPeople(ltList);
        }

        @Override
        public void addPeople(People people) {
            ltList.add(people);
        }

        @Override
        public void removePeople(People people) {
            int index = ltList.indexOf(people);
            if(index>0)
                ltList.remove(index);
        }

        @Override
        public void tellPeople(List<Listen> listenList) {
            for (Listen lis:ltList) {
                lis.listen(msg);
            }
        }
    }

    interface Listen{
        void listen(String msg);
    }

    static class People implements Listen{

        public String msg;

        public People(Roles roles){
            roles.addPeople(this);
        }


        @Override
        public void listen(String msg) {
            System.out.println("消息消費了:"+msg);
        }
    }
}

如果感覺有點暈,就把接口全部去掉直接一對一,一個機構發給一羣特定的人,稍稍修改一下,更容易接受哦~

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章