Java-马士兵设计模式学习笔记-观察者模式-读取properties文件,动态增加观察者

一、概述

1.目标:用observer.properties文件存储observer类,当要增加observer时,无需修改代码,修改properties文件即可

2.properties文件位置的关系:当properties文件放在src目录下时,由于编译会自动把src里的文件放到bin文件平,因此可用this.getClass.getClassLoader.getResourceAsStream(fileName)读取,当把properties文件放到包里时,则应加相应的包路径,如:

props.load(Test.class.getClassLoader().getResourceAsStream("com/tong/observer/observer.properties"));

PS:由于每次都要load properties文件(IO操作耗资源),所以效率低,可考虑把相关IO操作的写成static块(单例模式),在类装载时只load一次properties文件

二、代码

1.Test.java

  1 class WakenUpEvent{
  2     
  3     private long time;
  4     private String location;
  5     private Child source;
  6     
  7     public WakenUpEvent(long time, String location, Child source) {
  8         super();
  9         this.time = time;
 10         this.location = location;
 11         this.source = source;
 12     }
 13 
 14     public long getTime() {
 15         return time;
 16     }
 17 
 18     public void setTime(long time) {
 19         this.time = time;
 20     }
 21 
 22     public String getLocation() {
 23         return location;
 24     }
 25 
 26     public void setLocation(String location) {
 27         this.location = location;
 28     }
 29 
 30     public Child getSource() {
 31         return source;
 32     }
 33 
 34     public void setSource(Child source) {
 35         this.source = source;
 36     }
 37     
 38     
 39 }
 40 
 41 class Child implements Runnable {
 42     
 43     private List<WakenUpListener> wakenUpListeners = new ArrayList<WakenUpListener>();
 44     
 45     public void addWakenUpListener(WakenUpListener wul){
 46         wakenUpListeners.add(wul);
 47     }
 48     public void wakeUp(){
 49         for(int i = 0; i < wakenUpListeners.size(); i++){
 50             WakenUpListener l = wakenUpListeners.get(i);
 51             l.actionToWakenUp(new WakenUpEvent(System.currentTimeMillis(), "bed", this));
 52         }
 53     }
 54 
 55     @Override
 56     public void run() {
 57         try {
 58             Thread.sleep(3000);
 59         } catch (Exception e) {
 60             e.printStackTrace();
 61         }
 62         wakeUp();
 63     }
 64 }
 65 
 66 
 67 interface WakenUpListener {
 68     public void actionToWakenUp(WakenUpEvent e);
 69 }
 70 
 71 class Dad implements WakenUpListener {
 72 
 73     public void actionToWakenUp(WakenUpEvent e) {
 74         System.out.println("Fedd the child");
 75     }
 76     
 77 }
 78 
 79 class GrandFather implements WakenUpListener {
 80 
 81     public void actionToWakenUp(WakenUpEvent e) {
 82         System.out.println("抱孩子");
 83     }
 84     
 85 }
 86 
 87 
 88 public class Test {
 89 
 90     public static void main(String[] args) {
 91         
 92         Child c = new Child();
 93         
 94         Properties props = new Properties();
 95         try {
 96             props.load(Test.class.getClassLoader().getResourceAsStream("com/tong/observer/observer.properties"));
 97         } catch (Exception e) {
 98             e.printStackTrace();
 99         }
100         
101         String [] observers = props.getProperty("observers").split(",");
102         
103         for(String s : observers){
104             try {
105                 c.addWakenUpListener((WakenUpListener)Class.forName(s).newInstance());
106             } catch (Exception e) {
107                 e.printStackTrace();
108             }
109         }
110         new Thread(c).start();
111     }
112 }

 

2.observer.properties

 1 observers=com.tong.observer.Dad,com.tong.observer.GrandFather 

三、运行结果:

转载于:https://www.cnblogs.com/shamgod/p/4588865.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值