• 【设计模式】邮件订阅类——观察者模式


     观察者模式园子里的文章特别多,下面几篇都是不错的,写的也很容易理解。

    http://www.cnblogs.com/java-my-life/archive/2012/05/16/2502279.html

    http://www.cnblogs.com/mengdd/archive/2013/02/07/2908929.html

    定义:

    观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。

    观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

    熟能生效,观察者模式既然非常适合于发布订阅这种场景,就使用这种场景来写一个例子增加对观察者模式的理解。类图如下:

     

    1、先定义邮件的类,也就是观察者

    先定义邮件接口,此接口只有一个更新的方法,用于接收更新的邮件订阅:

    public interface IMail {
        
        public void updateMail(String str);
    
    }

    该接口的实现:

    在更新订阅的时候,打印该邮箱主人的名称+更新内容。

    public class Mail implements IMail {
    
        private String mUserName;
        
        public Mail(String name) {
            mUserName=name;
        }
        
        @Override
        public void updateMail(String str) {
            System.out.print(mUserName+"收到新消息:");
            System.out.print(str);
            System.out.println("新消息结束!");
        }
    }

    2、定义邮件服务器类,也就是主体(被观察者)。

    先定义一个IMailServer接口:

    public interface IMailServer {
        
        public void add(IMail mail);
        public void remove(IMail mail);
        public void notifyChange(String str);
    }

    该接口的实现类:

    public class MailServer implements IMailServer {
    
        private List<IMail> mailList=new ArrayList<IMail>();
        
        @Override
        public void add(IMail mail) {
            mailList.add(mail);
        }
         
        @Override
        public void remove(IMail mail) {
            mailList.remove(mail);
    
        }
    
        @Override
        public void notifyChange(String str) {
            for(IMail mail : mailList){
                mail.updateMail(str);
            }
        }
    }

    3、测试类以及结果:

    public class TestObserver {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            
            //server
            IMailServer mailServer=new MailServer();
            
            //three mail client
            IMail mail1=new Mail("张三");
            IMail mail2=new Mail("李四");
            IMail mail3=new Mail("王五");
            
            mailServer.add(mail1);
            mailServer.add(mail2);
            mailServer.add(mail3);
            
            mailServer.notifyChange("there is 3 new mail,to update client mail!");
        }
    
    }

    运行结果:

    张三收到新消息:there is 3 new mail,to update client mail!新消息结束!
    李四收到新消息:there is 3 new mail,to update client mail!新消息结束!
    王五收到新消息:there is 3 new mail,to update client mail!新消息结束!
  • 相关阅读:
    Java多线程的两种实现方式
    Java实现验证码的产生和验证
    web前端对上传的文件进行类型大小判断的js自定义函数
    Java前端Rsa公钥加密,后端Rsa私钥解密(支持字符和中文)
    了解火爆的区块链和比特币
    Java中调用JavaScript方法
    Java读取文件的问题
    SpringBoot热部署简介
    Java使用Jetty实现嵌入式Web服务器及Servlet容器
    『安全工具』目录扫描 DirBuster AND 御剑
  • 原文地址:https://www.cnblogs.com/xiajf/p/4184204.html
Copyright © 2020-2023  润新知