监听者模式示例

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 监视者模式(Observer pattern)是一种软件设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。 在 Java 中,我们可以使用 java.util.Observable 类和 java.util.Observer 接口来实现监视者模式。Observable 类是一个抽象类,它实现了一个被观察者对象的基本功能。Observer 接口则定义了一个观察者对象的接口,这个接口包含了一个 update() 方法,用于在被观察者对象状态发生变化时被调用。 下面是一个简单的 Java 代码示例,它展示了如何使用 Observable 类和 Observer 接口来实现监视者模式: ``` import java.util.Observable; import java.util.Observer; // 定义一个被观察者类 class Subject extends Observable { private int state; public int getState() { return state; } public void setState(int state) { this.state = state; // 当状态发生改变时,调用 setChanged() 方法来标记这个被观察者对象为已改变状态 setChanged(); // 调用 notifyObservers() 方法来通知所有观察者 notifyObservers(); } } // 定义一个观察者类 class Observer1 implements Observer { ### 回答2: 监视者模式是一种行为设计模式,用于对象之间的松耦合通信。在该模式中,当某个对象的状态发生改变时,其他依赖该对象的对象会被通知到,从而可以采取相应的行动。以下是一个使用Java编写的简单监视者模式示例代码。 首先,定义一个Subject接口,用于被观察的对象: ``` public interface Subject { void attach(Observer observer); // 添加观察者 void detach(Observer observer); // 移除观察者 void notifyObservers(); // 通知观察者 } ``` 然后,实现一个具体的Subject类: ``` import java.util.ArrayList; import java.util.List; public class ConcreteSubject implements Subject { private List<Observer> observers = new ArrayList<>(); private String state; public void setState(String state) { this.state = state; notifyObservers(); } @Override public void attach(Observer observer) { observers.add(observer); } @Override public void detach(Observer observer) { observers.remove(observer); } @Override public void notifyObservers() { for (Observer observer : observers) { observer.update(); } } } ``` 接下来,定义一个Observer接口,用于观察者: ``` public interface Observer { void update(); } ``` 最后,实现一个具体的Observer类: ``` public class ConcreteObserver implements Observer { private String observerState; private Subject subject; public ConcreteObserver(Subject subject) { this.subject = subject; subject.attach(this); } public void update() { observerState = subject.getState(); System.out.println("观察者状态已更新:" + observerState); } } ``` 使用示例: ``` public class Main { public static void main(String[] args) { // 创建被观察对象 ConcreteSubject subject = new ConcreteSubject(); // 创建观察者对象 ConcreteObserver observer1 = new ConcreteObserver(subject); ConcreteObserver observer2 = new ConcreteObserver(subject); // 设置被观察对象的状态 subject.setState("State 1"); // 移除一个观察者对象 subject.detach(observer2); // 再次设置被观察对象的状态 subject.setState("State 2"); } } ``` 运行以上代码,输出: ``` 观察者状态已更新:State 1 观察者状态已更新:State 1 观察者状态已更新:State 2 ``` 以上代码示例实现了一个简单的监视者模式。当被观察对象的状态发生改变时,观察者对象会被通知到并更新自己的状态。 ### 回答3: 监视者模式是一种设计模式,用于实现对象之间的一对多依赖关系。当被监视的对象发生变化时,监视者对象会收到通知并做出相应的处理。 下面是一个简单的Java代码示例,演示了如何实现监视者模式: 首先,我们需要定义一个被监视的对象类Subject,它包含一个用于存储监视者对象的列表,并提供注册和注销监视者的方法,以及通知监视者的方法。 ```java import java.util.ArrayList; import java.util.List; public class Subject { private List<Observer> observers = new ArrayList<>(); public void registerObserver(Observer observer) { observers.add(observer); } public void unregisterObserver(Observer observer) { observers.remove(observer); } public void notifyObservers() { for (Observer observer : observers) { observer.update(); } } } ``` 接下来,我们需要定义一个监视者对象类Observer,它包含一个用于响应被监视对象变化的方法。 ```java public class Observer { public void update() { System.out.println("收到通知并执行相应操作..."); } } ``` 最后,我们可以在主函数中演示如何使用监视者模式。创建一个Subject对象,并注册一个Observer对象作为监视者。然后修改被监视对象的状态,并调用notifyObservers方法通知所有监视者。 ```java public class Main { public static void main(String[] args) { Subject subject = new Subject(); Observer observer = new Observer(); subject.registerObserver(observer); // 修改被监视对象的状态 // ... subject.notifyObservers(); } } ``` 以上就是一个简单的Java实现的监视者模式示例。通过使用该模式,我们可以轻松实现对象之间的一对多依赖关系,并在被监视对象发生变化时通知相关的监视者对象。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值