• 观察者设计模式


    在网上找了很久没看见有讲的很清楚的,我自己花了一点时间终于弄懂了,现在想用最通俗易懂的方法将观察者设计模式讲明白

    观察者设计模式类似于发布订阅模式,所以我准备以订阅用户定义公众号来举例说明

    首先创建公众号接口类

     1 package 观察者模式;
     2 //公众号接口
     3 interface WechatInterface {
     4     //添加用户
     5     void addUser(User user);
     6     //删除用户(这里相当于将用户放入黑名单)
     7     void deleteUser(User user);
     8     //当公众号要推送新的内容时,调用这个方法
     9     void notifyUser();
    10 }

    其次创建订阅接口类

    1 package 观察者模式;
    2 //订阅接口
    3 interface Oder {
    4     //当公众号更新内容的时候,会将内容传入该方法,每个微信公众号的订阅者都要实现该方法
    5     public void update(String message);
    6 }

    接下来创建公众号类

     1 package 观察者模式;
     2 import java.util.ArrayList;
     3 import java.util.List;
     4 
     5 //公众号类
     6 public class WechatOfficialAccount implements WechatInterface{
     7 
     8     //微信公众号维护内部维护了很多订阅用户
     9     private List<User> userList = new ArrayList<>();
    10 
    11     //公众号的名字
    12     private String wechatName;
    13 
    14     //要推送的内容
    15     private String message;
    16 
    17     public WechatOfficialAccount(String wechatName) {
    18         this.wechatName = wechatName;
    19     }
    20 
    21     public void setMessage(String message) {
    22         this.message = message;
    23         this.notifyUser();
    24     }
    25 
    26     @Override
    27     public void addUser(User user) {
    28         userList.add(user);
    29     }
    30 
    31     @Override
    32     public void deleteUser(User user) {
    33         if (userList.indexOf(user)>=0){
    34             userList.remove(user);
    35         }
    36     }
    37 
    38     @Override
    39     public void notifyUser() {
    40         message=this.wechatName+this.message;
    41         for (User user:userList) {
    42             user.update(message);
    43         }
    44     }
    45 }

    接下来创建用户类

     1 package 观察者模式;
     2 //公众号的订阅用户
     3 public class User implements Oder{
     4 
     5     //用户关注的公众号
     6     private WechatOfficialAccount wechatOfficialAccount;
     7 
     8     //用户名
     9     private String username;
    10 
    11     public User(WechatOfficialAccount wechatOfficialAccount, String username) {
    12         this.wechatOfficialAccount = wechatOfficialAccount;
    13         this.username = username;
    14         wechatOfficialAccount.addUser(this);//每创建一个用户,都叫他关注这个公众号
    15     }
    16 
    17     @Override
    18     public void update(String message) {
    19         System.out.println(username+"收到消息"+message);
    20     }
    21 }

    接下来创建主方法进行测试

     1 package 观察者模式;
     2 //测试观察者模式的主类
     3 public class Main {
     4     public static void main(String[] args) {
     5         WechatOfficialAccount wechatOfficialAccount = new WechatOfficialAccount("罗辑思维");
     6         User user1 = new User(wechatOfficialAccount,"马芸");
     7         User user2 = new User(wechatOfficialAccount,"马化疼");
     8         User user3 = new User(wechatOfficialAccount,"李艳红");
     9 
    10         wechatOfficialAccount.setMessage("今日推送的内容为:时间的朋友");
    11 
    12         wechatOfficialAccount.deleteUser(user2);//马化疼因为怼罗辑思维,被罗辑思维放黑名单了
    13 
    14         wechatOfficialAccount.setMessage("今日推送的内容为:终身学习");
    15 
    16     }
    17 }

    以下是输出结果

    1 马芸收到消息罗辑思维今日推送的内容为:时间的朋友
    2 马化疼收到消息罗辑思维今日推送的内容为:时间的朋友
    3 李艳红收到消息罗辑思维今日推送的内容为:时间的朋友
    4 马芸收到消息罗辑思维今日推送的内容为:终身学习
    5 李艳红收到消息罗辑思维今日推送的内容为:终身学习
    6 
    7 Process finished with exit code 0
  • 相关阅读:
    鼠标移向小图显示大图
    一个简单漂亮的CSS相册代码
    windows 应该关闭服务
    NetBIOS名称
    DOS命令大全(经典收藏)
    大揭露:Win中也有各种不老实的服务
    变量名
    ASP.NET2.0 GridView小技巧汇粹 (转)
    Dfs实战技术
    windows 2003中活动目录支持文件
  • 原文地址:https://www.cnblogs.com/parkour1026/p/10795983.html
Copyright © 2020-2023  润新知