`
nathan09
  • 浏览: 144939 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

【读书笔记】TiJava——内部类使用范例:温室控制器

 
阅读更多

控制器抽象层,包括抽象事件的定义及控制器的定义:

public abstract class Event {
	private long eventTime;
	protected final long delayTime;

	public Event(long delayTime) {
		this.delayTime = delayTime;
	}

	public void start() { // Allows restarting
		eventTime = System.currentTimeMillis() + delayTime;
	}

	public boolean ready() {
		return System.currentTimeMillis() >= eventTime;
	}

	public void action(){
		System.out.println(this);
	}
}
public class Controller {
	// A class from java.util to hold Event objects:
	private List<Event> eventList = new ArrayList<Event>();

	public void addEvent(Event c) {
		c.start();
		eventList.add(c);
	}

	public void run() throws InterruptedException {
		while (eventList.size() > 0)
			// Make a copy so you're not modifying the list
			// while you're selecting the elements in it:
			for (Event e : new ArrayList<Event>(eventList))
				if (e.ready()) {
					e.action();
					eventList.remove(e);
					TimeUnit.MILLISECONDS.sleep(100);
				}
	}
}

使用内部类定义各种具体的事件行为

public class GreenhouseControls extends Controller {
	private boolean light = false;

	public class LightOn extends Event {
		public LightOn(long delayTime) {
			super(delayTime);
		}

		public void action() {
			// Put hardware control code here to
			// physically turn on the light.
			super.action();
			light = true;
		}

		public String toString() {
			return "Light is on";
		}
	}

	public class LightOff extends Event {
		public LightOff(long delayTime) {
			super(delayTime);
		}

		public void action() {
			// Put hardware control code here to
			// physically turn off the light.
			super.action();
			light = false;
		}

		public String toString() {
			return "Light is off";
		}
	}

	private boolean water = false;

	public class WaterOn extends Event {
		public WaterOn(long delayTime) {
			super(delayTime);
		}

		public void action() {
			// Put hardware control code here.
			super.action();
			water = true;
		}

		public String toString() {
			return "Greenhouse water is on";
		}
	}

	public class WaterOff extends Event {
		public WaterOff(long delayTime) {
			super(delayTime);
		}

		public void action() {
			// Put hardware control code here.
			super.action();
			water = false;
		}

		public String toString() {
			return "Greenhouse water is off";
		}
	}

	private String thermostat = "Day";

	public class ThermostatNight extends Event {
		public ThermostatNight(long delayTime) {
			super(delayTime);
		}

		public void action() {
			// Put hardware control code here.
			super.action();
			thermostat = "Night";
		}

		public String toString() {
			return "Thermostat on night setting";
		}
	}

	public class ThermostatDay extends Event {
		public ThermostatDay(long delayTime) {
			super(delayTime);
		}

		public void action() {
			// Put hardware control code here.
			super.action();
			thermostat = "Day";
		}

		public String toString() {
			return "Thermostat on day setting";
		}
	}

	public class Bell extends Event {
		public Bell(long delayTime) {
			super(delayTime);
		}

		public void action() {
			super.action();
		}

		public String toString() {
			return "Bing!";
		}
	}

	public class Restart extends Event {
		private List<Event> eventList;

		public Restart(long delayTime, List<Event> arrayList) {
			super(delayTime);
			arrayList.add(this);
			this.eventList = new ArrayList<Event>(arrayList);
			for (Event e : arrayList)
				addEvent(e);
		}

		public void action() {
			super.action();
			for (Event e : eventList) {
				addEvent(e);
			}
		}

		public String toString() {
			return "Restarting system";
		}
	}

	public static class Terminate extends Event {
		public Terminate(long delayTime) {
			super(delayTime);
		}

		public void action() {
			System.exit(0);
		}

		public String toString() {
			return "Terminating";
		}
	}
}

启动控制器

public class GreenhouseController {
	public static void main(String[] args) throws InterruptedException {
		final GreenhouseControls gc = new GreenhouseControls();
		gc.new Restart(2000, new ArrayList<Event>() {
			{
				this.add(gc.new ThermostatNight(0));
				this.add(gc.new LightOn(200));
				this.add(gc.new LightOff(400));
				this.add(gc.new WaterOn(600));
				this.add(gc.new WaterOff(800));
				this.add(gc.new Bell(900));
				this.add(gc.new ThermostatDay(1400));
			}
		});
		if (args.length == 1)
			gc.addEvent(new GreenhouseControls.Terminate(new Integer(args[0])));
		gc.run();		
	}
}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics