内部类与控制框架 java

package innerclasses.controller;

public abstract class Event {
	private long eventTime;
	protected final long delayTime;
	/**
	 * 设定最大延迟时间
	 * @param delayTime
	 */
	public Event(long delayTime) {
		this.delayTime = delayTime;
		start();
	}
	/**
	 * 获取时间开始时的最小延迟时间
	 */
	public void start() {
		eventTime = System.nanoTime() + delayTime;
	}
	/**
	 * 判断是否延迟
	 * @return
	 */
	public boolean ready() {
		return System.nanoTime() >= eventTime;
	}
	/**
	 * 具体的事务
	 */
	public abstract void action();
}

package innerclasses.controller;

import java.util.ArrayList;
import java.util.List;
/**
 * 事务流程处理器
 * 按照一定的顺序进行事务处理
 * @author hehe
 *
 */
public class Controller {
	//按照线性的顺序进行事务处理,也可以用Stack处理,那就是先进后出的顺序处理事务
	private List<Event> eventList = new ArrayList<Event>();
	/**
	 * 在队列尾部增加一个事务
	 * @param c
	 */
	public void addEvent(Event c) {
		eventList.add(c);
	}

	/**
	 * 具体的事务处理流程,删除处理完的事务
	 */
	public void run() {
		while (eventList.size() > 0) {
			for (Event e : new ArrayList<Event>(eventList)) {
				if (e.ready()) {
					System.out.println(e);
					e.action();
					eventList.remove(e);
				}
			}
		}
	}
}
package innerclasses;

import innerclasses.controller.Controller;
import innerclasses.controller.Event;
/**
 * 具体的事务实现(内部类的方式)
 * @author hehe
 *
 */
public class GreenhouseControls extends Controller {
//	通过内部类可以访问到内部类外围的所有方法和字段  如 light  Controller中的addEvent方法
	private boolean light=false;
	/**
	 * 开灯事件
	 * @author hehe
	 */
	public class LightOn extends Event{
		public LightOn(long delayTime) {
			super(delayTime);
		}
		@Override
		public void action() {
			light=true;
		}
		@Override
		public String toString() {
			return "Light is on";
		}
	}
	
	/**
	 * 响铃事件
	 * @author hehe
	 *
	 */
	public class Bell extends Event{

		public Bell(long delayTime) {
			super(delayTime);
		}

		@Override
		public void action() {
//			递归响铃事件  若delayTime相等 则跟addEvent(this); 方法相同
			addEvent(new Bell(delayTime));
			
		}
		@Override
		public String toString() {
			return "Bing !";
		}
	}
	
	/**
	 * 重启事务
	 * @author hehe
	 *
	 */
	public class Restart extends Event{
		private Event[] eventList;
		public Restart(long delayTime,Event[] eventList) {
			super(delayTime);
			this.eventList=eventList;
			for(Event e:eventList){
				addEvent(e);
			}
		}

		@Override
		public void action() {
//			将需要重启的事务再次放入队列中
			for(Event e:eventList){
				e.start();
				addEvent(e);
			}
//			递归重启事务
			start();
			addEvent(this);
		}
		
		@Override
		public String toString() {
			return "Restarting system";
		}
	}
//	静态内部类不可以访问到内部类外围的非静态方法和字段
	public static class Terminate extends Event{

		public Terminate(long delayTime) {
			super(delayTime);
		}

		@Override
		public void action() {
			System.exit(0);
		}
		
		@Override
		public String toString() {
			return "Terminating";
		}
	}
	
	//-----------------------------------与上面方法类似----------------------------------------//
	public class LightOff extends Event{

		public LightOff(long delayTime) {
			super(delayTime);
		}

		@Override
		public void action() {
			light=false;
		}
		@Override
		public String toString() {
			// TODO Auto-generated method stub
			return "Light is Off";
		}
	}
	
	private boolean water = false;
	
	public class WaterOn extends Event{

		public WaterOn(long delayTime) {
			super(delayTime);
		}

		@Override
		public void action() {
			water=true;
		}
		
		@Override
		public String toString() {
			return "Water is On";
		}
		
	}
	public class WaterOff extends Event{

		public WaterOff(long delayTime) {
			super(delayTime);
		}

		@Override
		public void action() {
			water=false;
		}
		
		@Override
		public String toString() {
			return "Water is Off";
		}
	}
	
	private String thermostat="Day";
	public class ThermostatNight extends Event{
		public ThermostatNight(long delayTime) {
			super(delayTime);
		}

		@Override
		public void action() {
			thermostat="Night";
		}
		@Override
		public String toString() {
			return "Thermostat on night setting";
		}
	}
	public class ThermostatDay extends Event{
		public ThermostatDay(long delayTime) {
			super(delayTime);
		}
		
		@Override
		public void action() {
			thermostat="Day";
		}
		@Override
		public String toString() {
			return "Thermostat on day setting";
		}
	}
	
}
package innerclasses;

import innerclasses.controller.Event;

public class GreenhouseController {

	/**测试方法
	 * @param args
	 */
	public static void main(String[] args) {
		GreenhouseControls gc=new GreenhouseControls();
		gc.addEvent(gc.new Bell(900));
		Event[] eventList={
			gc.new ThermostatNight(0),
			gc.new LightOn(200),
			gc.new LightOff(200),
			gc.new WaterOn(600),
			gc.new WaterOff(800),
			gc.new ThermostatDay(1400)
		};
//		重复启动Event[]中的方法
		gc.addEvent(gc.new Restart(2000,eventList));
//		设置程序运行的最大运行事件(此方法若不设置将会无限执行下去)
		if(args.length==1){
			gc.addEvent(new GreenhouseControls.Terminate(new Integer(args[0])));
		}
//		运行事务队列
		gc.run();
	}

}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值