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

设计模式之观察者模式

作者: chuan_bai | 来源:发表于2021-04-01 16:25 被阅读0次
    被观察者
    /**
     * @Author: chuan.bai
     * @Description  邮件发送人
     * @Date: Created on 15:03 2021/4/1
     * @Modified By:
     */
    public interface EmailSender {
    
        /**
         * 新增需要发送邮件的人
         * @param emailReceiver
         */
        void addUser(EmailReceiver emailReceiver);
    
        /**
         * 删除需要发送邮件的人
         * @param emailReceiver
         */
        void removeUser(EmailReceiver emailReceiver);
    
        /**
         * 通知收件人接收邮件
         * @param msg
         */
        void sendMsgToUser(String msg);
    }
    
    
    观察者抽象
    /**
     * @Author: chuan.bai
     * @Description  邮件收件人
     * @Date: Created on 15:03 2021/4/1
     * @Modified By:
     */
    public interface EmailReceiver {
    
    
        /**
         * 接收邮件
         * @param msg
         */
        void receiveEmailMsg(String name,String msg);
    }
    
    
    观察者的实现类
    /**
     * @Author: chuan.bai
     * @Description   收件人
     * @Date: Created on 15:20 2021/4/1
     * @Modified By:
     */
    public class ReceiverUser implements EmailReceiver{
    
        /**
         * 收件人姓名
         */
        private String name;
    
        public ReceiverUser(String name) {
            this.name = name;
        }
    
    
        @Override
        public void receiveEmailMsg(String name, String msg) {
            System.out.println("用户" + this.name + "收到"+name+"的邮件内容为:" + msg);
        }
    }
    
    
    被观察者的实现
    /**
     * @Author: chuan.bai
     * @Description
     * @Date: Created on 15:15 2021/4/1
     * @Modified By:
     */
    public class SenderUser implements EmailSender{
    
        /**
         * 声明收件人列表
         */
        private List<EmailReceiver> receiverList;
        /**
         * 发件人姓名
         */
        private String name;
    
        public SenderUser(String name) {
            this.receiverList = new ArrayList<>();
            this.name = name;
        }
    
        @Override
        public void addUser(EmailReceiver emailReceiver) {
            receiverList.add(emailReceiver);
        }
    
        @Override
        public void removeUser(EmailReceiver emailReceiver) {
            receiverList.remove(emailReceiver);
        }
    
        @Override
        public void sendMsgToUser(String msg) {
            //遍历收件人列表 ,向他们群发邮件
            for (EmailReceiver emailReceiver : receiverList) {
                emailReceiver.receiveEmailMsg(this.name,msg);
            }
        }
    }
    
    
    客户端
    /**
     * @Author: chuan.bai
     * @Description  邮件客户端
     * @Date: Created on 15:26 2021/4/1
     * @Modified By:
     */
    public class EmailClient {
    
        public static void main(String[] args) {
            SenderUser senderUser = new SenderUser("系统用户");
            ReceiverUser receiverUser1 = new ReceiverUser("jack");
            senderUser.addUser(receiverUser1);
            senderUser.sendMsgToUser("发的第一邮件");
            ReceiverUser receiverUser2 = new ReceiverUser("lucy");
            //加入收件人2 也作为收件人列表
            senderUser.addUser(receiverUser2);
            senderUser.sendMsgToUser("发的第二封邮件");
    
    
        }
    }
    
    
    
    结果
    用户jack收到系统邮箱的邮件内容为:发的第一邮件
    用户jack收到系统邮箱的邮件内容为:发的第二封邮件
    用户lucy收到系统邮箱的邮件内容为:发的第二封邮件
    
    同时是观察者和被观察者
    /**
     * @Author: chuan.bai
     * @Description  邮件收发人 (既能收邮件又能发邮件)
     * @Date: Created on 15:36 2021/4/1
     * @Modified By:
     */
    public class ReceiverAndSender implements EmailSender,EmailReceiver{
    
    
    
        private List<EmailReceiver> receiverUserList;
        private String name;
    
    
    
        public ReceiverAndSender(String name) {
            this.receiverUserList = new ArrayList<>();
            this.name = name;
        }
    
        @Override
        public void receiveEmailMsg(String name, String msg) {
            System.out.println("用户" + this.name + "收到"+name+"的邮件内容为:" + msg);
        }
    
        @Override
        public void addUser(EmailReceiver emailReceiver) {
            receiverUserList.add(emailReceiver);
            System.out.println("收件人增加");
        }
    
        @Override
        public void removeUser(EmailReceiver emailReceiver) {
            receiverUserList.remove(emailReceiver);
            System.out.println("收件人剔除");
        }
    
        @Override
        public void sendMsgToUser(String msg) {
            //遍历收件人列表 ,向他们群发邮件
            for (EmailReceiver emailReceiver : receiverUserList) {
                emailReceiver.receiveEmailMsg(this.name,msg);
            }
        }
    
    
    }
    
    
    客户端
    /**
     * @Author: chuan.bai
     * @Description
     * @Date: Created on 15:50 2021/4/1
     * @Modified By:
     */
    public class EmailClient2 {
    
        public static void main(String[] args) {
            ReceiverAndSender jack = new ReceiverAndSender("jack");
            ReceiverAndSender bill = new ReceiverAndSender("bill");
            ReceiverAndSender lucy = new ReceiverAndSender("lucy");
            jack.addUser(bill);
            jack.addUser(lucy);
            jack.sendMsgToUser("aaa");
    
            bill.addUser(jack);
            bill.addUser(lucy);
            bill.sendMsgToUser("cc");
    
            lucy.addUser(bill);
            lucy.addUser(jack);
            lucy.sendMsgToUser("dd");
    
        }
    }
    
    执行结果
    收件人增加
    收件人增加
    用户bill收到jack的邮件内容为:aaa
    用户lucy收到jack的邮件内容为:aaa
    收件人增加
    收件人增加
    用户jack收到bill的邮件内容为:cc
    用户lucy收到bill的邮件内容为:cc
    收件人增加
    收件人增加
    用户bill收到lucy的邮件内容为:dd
    用户jack收到lucy的邮件内容为:dd
    
    

    相关文章

      网友评论

          本文标题:设计模式之观察者模式

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