美文网首页设计模式
Java 观察者模式

Java 观察者模式

作者: Yohann丶blog | 来源:发表于2020-09-07 14:47 被阅读0次
    WechatIMG147.jpeg

    介绍

    shiyanlou:在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。

    角色

    角色 说明
    Subject 抽象目标类,一般至少提供三个接口:
    添附(attach)
    解附(detach)
    通知(notify)
    ConcreteSubject 具体目标,提供了观察者欲追踪的状态,也可设置目标状态
    Observer 抽象观察者,定义观察者的更新操作接口
    ConcreteObserver 具体观察者,实现抽象观察者的接口,做出自己的更新操作

    角色示例

    类名 担任角色 说明
    OfficialAccount Subject 微信公众号,提供三个接口:
    关注(follow)
    取关(unFollow)
    推送(send)
    MyOfficialAccount ConcreteSubject 我的微信公众号
    User Observer 用户
    Developer ConcreteObserver 开发者

    UML类图

    观察者模式.png

    代码

    • 创建 User.java,代码如下
    abstract class User {
        abstract public String receive(OfficialAccount officialAccount);
        abstract public String getUsername();
    }
    
    • 创建 Developer.java,代码如下
    public class Developer extends User {
        protected String name;
    
        public Developer(String name){
            this.name = name;
        }
    
        @Override
        public String receive(OfficialAccount officialAccount) {
            return this.name+"接收到推送的文章:"+officialAccount.getArticle()+"\n";
        }
    
        @Override
        public String getUsername(){
            return this.name;
        }
    }
    
    • 创建 OfficialAccount.java,代码如下
    import java.util.ArrayList;
    
    abstract class OfficialAccount {
        private ArrayList<User> userList;
    
        public OfficialAccount(){
            userList = new ArrayList<User>();
        }
        
        public String follow(User user) {
            userList.add(user);
            return user.getUsername()+" 关注了公众号";
        }
    
        public String unFollow(User user) {
            userList.remove(user);
            return user.getUsername()+" 取关了公众号";
        }
    
        public String send() {
            String sendLog = "";
            for (User user: userList) {
                sendLog += user.receive(this);
            }
            return sendLog;
        }
    
        abstract public void setArticle(String article);
    
        abstract public String getArticle();
    }
    
    • 创建 MyOfficialAccount.java,代码如下
    public class MyOfficialAccount extends OfficialAccount{
    
        private String article;
    
        public void setArticle(String article) {
            this.article = article;
        }
    
        public String getArticle() {
            return this.article;
        }
    }
    
    • 创建 OfficialAccountTest.java,代码如下
    public class OfficialAccountTest {
        public static void main(String[] args) {
            OfficialAccount myOfficialAccount = new MyOfficialAccount();
    
            User alan = new Developer("Alan");
            User bob = new Developer("Bob");
            
            System.out.println(myOfficialAccount.follow(alan));
            System.out.println(myOfficialAccount.follow(bob));
    
            myOfficialAccount.setArticle("《关于作者》");
            System.out.println(myOfficialAccount.send());
            
            myOfficialAccount.setArticle("《Java 观察者模式》");
            System.out.println(myOfficialAccount.unFollow(bob));
            System.out.println(myOfficialAccount.send());
        }
    }
    

    执行

    $ javac OfficialAccountTest.java
    $ java OfficialAccountTest
    Alan 关注了公众号
    Bob 关注了公众号
    Alan 接收到推送的文章:《关于作者》
    Bob 接收到推送的文章:《关于作者》
    Bob 取关了公众号
    Alan 接收到推送的文章:《设计模式 观察者模式》
    

    相关文章

      网友评论

        本文标题:Java 观察者模式

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