监听者模式示例
来源:互联网 发布:微信轰天雷炸群软件 编辑:程序博客网 时间:2024/06/05 19:57
public class SwitchMain { public static void main(String[] args) { Switch switchTest = new Switch(); switchTest.addListener(new SwitchListener() { public void handle(SwitchEvent switchEvent) { //Do what ever you want ! System.out.println("可对该事件进行二次处理: "+switchEvent.getSwitchState()); }public void handle() {//SwitchListener=callBack System.out.println("回调执行复杂操作");} }); //触发 switchTest.call(); switchTest.close(); }}/* * 类似于Swing中的button * 1.添加监听者 * 2.定义事件同时通知监听者*/class Switch {private SwitchListener callBack;public void addListener(SwitchListener callBack){this.callBack = callBack;}//此时为回调方法 没有监听者概念public void call(){callBack.handle();//SwitchEvent switchEvent = new SwitchEvent( this, "关");//callBack.handle(switchEvent);}public void close(){SwitchEvent switchEvent = new SwitchEvent( this, "关");notifyListeners(switchEvent);}private void notifyListeners (SwitchEvent switchEvent) {callBack.handle(switchEvent); }}class SwitchEvent { private String switchState; //表示开关的状态 public SwitchEvent(Switch source, String switchState) { this.switchState = switchState; } public void setSwitchState(String switchState) { this.switchState = switchState; } public String getSwitchState() { return switchState; }}interface SwitchListener {//SwitchListener=callBack() void handle();//基于回调的观察者模式 void handle(SwitchEvent event);//支持指定处理事件}
示例2:监听文件的变化
import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;public class App{ public static void main( String[] args ) { List<ModulesListener> modules = new ArrayList<ModulesListener>(); ModulesListener listener = new ModulesListener("custom.properties"); listener.addConfigurationListener(new ConfigurationListener() { public void configurationChanged(ConfigurationEvent event) { System.out.println("ConfigurationListener, " + event.getType() + ", " + event.getModules()); } }); listener.addKeyListener("name", new PropertiesKeyListener() { public void configurationChanged(ConfigurationEvent event, String key, String value) { System.out.println("PropertiesKeyListener, " + key + " = " + value); } }); ModulesListener listener2 = new ModulesListener("system.properties"); listener2.addConfigurationListener(new ConfigurationListener() { public void configurationChanged(ConfigurationEvent event) { System.out.println("ConfigurationListener2, " + event.getType() + ", " + event.getModules()); } }); listener2.addKeyListener("name", new PropertiesKeyListener() { public void configurationChanged(ConfigurationEvent event, String key, String value) { System.out.println("PropertiesKeyListener2, " + key + " = " + value); } }); modules.add(listener); modules.add(listener2); SysProperties.getInstance().addListener(modules); }}interface ConfigurationListener {void configurationChanged(ConfigurationEvent event);}interface PropertiesKeyListener { void configurationChanged(ConfigurationEvent event, String key, String value);}class ConfigurationEvent{ private EventType type; private String modules; public ConfigurationEvent(Object source, EventType type) { this.type = type; } public EventType getType() { return type; } public void setType(EventType type) { this.type = type; } public String getModules() { return modules; } public void setModules(String modules) { this.modules = modules; }}class ModulesListener { private String name; private List<ConfigurationListener> configurationListeners = new ArrayList<ConfigurationListener>(); private Map<String, PropertiesKeyListener> keyListeners = new HashMap<String, PropertiesKeyListener>(); public ModulesListener(String name) { this.name = name; }public String getName() {return name;} /** * 新增模块更新监听 * * @param listener 监听接口 */ public void addConfigurationListener(ConfigurationListener listener) { configurationListeners.add(listener); } /** * 新增Properties模块key更新监听 * @param key 配置项 * @param listener 监听接口 */ public void addKeyListener(String key, PropertiesKeyListener listener) { keyListeners.put(key, listener); } /** * 模块更新监听,动作执行 * * @param event */ public void actionConfigurationListener(ConfigurationEvent event) { for (ConfigurationListener listener : configurationListeners) { listener.configurationChanged(event); } } /** * Properties模块key更新监听,动作执行 * * @param event * @param key * @param value */ public void actionKeyListeners(ConfigurationEvent event, String key, String value) { if (keyListeners.containsKey(key)) { keyListeners.get(key).configurationChanged(event, key, value); } }}enum EventType {ADD, UPDATE, CLEAR;}
import java.io.File;import java.io.FileInputStream;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Properties;/** * 读取实时的配置文件信息 */public class SysProperties {private Map<String, Long> lastModifMap = new HashMap<String, Long>();private static SysProperties instance; private Map<String, ModulesListener> modulesListeners = new HashMap<String, ModulesListener>();public static SysProperties getInstance() {if (instance == null) {instance = new SysProperties();}return instance;}public void addListener(List<ModulesListener> modules) {for(ModulesListener listener:modules){modulesListeners.put(listener.getName(), listener);}}/** * @description 私有构造器启动一个线程实时监控配置文件 */public SysProperties() {// 循环监控配置文件的变化,一旦发现文件发生变化了则重读配置文件Thread t = new Thread() {public void run() {while (true) {// 间隔1秒try {Thread.sleep(1000);} catch (InterruptedException e) {}try {String path = SysProperties.class.getClass().getResource("/config").getPath();File[] tmps = new File(path).listFiles();//File[] tmps = new File("E:\\Projects\\JavaProjects\\demo\\src\\main\\resources\\config").listFiles();for (File file : tmps) {if (file.exists()) { long l = file.lastModified(); // this can also throw a SecurityException String fileAbsPath = file.getAbsolutePath(); long lastModif = getLastModif(fileAbsPath); if (l > lastModif) { // however, if we reached this point this recordLastModify(fileAbsPath, l); ConfigurationEvent event = null; //不知道删除事件 if(lastModif == 0){ event = new ConfigurationEvent(file.getName(), EventType.ADD); }else{ event = new ConfigurationEvent(file.getName(), EventType.UPDATE); } event.setModules(file.getName()); //无法精确key的变化if(modulesListeners.containsKey(file.getName())){ModulesListener listener = modulesListeners.get(file.getName());Properties properties = transTo(file);listener.actionConfigurationListener(event);listener.actionKeyListeners(event, "name", properties.getProperty("name"));} } }}} catch (Exception e) {e.printStackTrace();}}}};t.start();}private long getLastModif(String key) { long lastModif = 0; if (lastModifMap.get(key) != null) { lastModif = lastModifMap.get(key).longValue(); } return lastModif; } private void recordLastModify(String key, Long lastModif) { lastModifMap.put(key, lastModif); } public Properties transTo(File propertyFile){ Properties properties = new Properties(); FileInputStream inputStreamLocal = null;try {inputStreamLocal = new FileInputStream(propertyFile);properties.load(inputStreamLocal);return properties;}catch(Exception e){e.printStackTrace();}return properties; }}
阅读全文
0 0
- 监听者模式示例
- 监听者模式
- 监听者模式
- 监听者模式
- ios线程监听者模式
- java中的监听者模式
- ios线程监听者模式
- 监听者—观察者模式
- 监听者模式理解(Swing)
- 监听原理----自定义监听--示例
- 设计模式之监听者模式
- 设计模式(Javaee)之---监听者模式
- FileObserver监听文件示例
- 静态监听配置示例
- 动态监听配置示例
- bootstrap滚动监听示例
- java事件监听示例
- viewPager监听示例
- JS基础--常用对象
- Java8新时间与日期API—本地时间与时间戳
- 最长递增子序列
- windows 无法连接xxxxx (无法连接无线路由器)
- 学习笔记--操作系统的知识点的概括(思维导图形式)
- 监听者模式示例
- 备忘录
- VS2010设置字体和行号
- nbuntu16.04安装docker
- 聊聊 React Router v4 的设计思想
- git push时出现错误refusing to update checked out branch: refs/heads/master
- Google算法题:寻找中位数
- JDBC
- BOM基础一