《Java编程思想》之更好了解内部类的价值(一个简单的例子)
2012-01-29 19:54 java线程例子 阅读(326) 评论(0) 编辑 收藏 举报
public abstract class Event{ private long eventTime; protected final long delayTime; public Event(long delayTime){ this.delayTime = delayTime; start(); } public void start(){ eventTime = System.currentTimeMillis() + delayTime; } public boolean ready(){ return System.currentTimeMillis() >= eventTime; } public abstract void action(); }
start()是个独立的方法,而没有包含在构造器内,因为这样就可以在时间运行以后重新启动计数器,也就是能够重复使用Event对象。例如,如果想重复一个事件,只需要简单地在action()中调用start()方法。
public class Controller { private List<Object> eventList = new ArrayList<Object>(); public void addEvent(Eventevent){ eventList.add(event); } public void run(){ while(eventList.size() > 0){ for(int i = 0; i < eventList.size(); i++){ Event event = (Event)eventList.get(i); if(event.ready()){ System.out.println(event); event.action(); eventList.remove(i); } } } } }
Controller包含了一个用来管理并触发事件的实际控制框架。
设计的关键在于:使变化的事物与不变的事物互相分离。“变化的事物”指的是不同的Event对象所具有的不同的行为,这可以通过不同的Event子类来变现。
这正是内部类所要做的事情,内部类允许:
1).用单一的类完整地实现控制框架,从而将实现的细节封装起来。内部类用来表示解决问题所不许的各种不同的action()。
2).内部类能够很容易地访问外围类的任意成员,具有很大的灵活性。
public class GreenhouseControls extends Controller{ private boolean light = false;//默认灯是关着的。 private boolean water = false;//默认水源是关着的。 private String thermostat = "Day";//默认在白天 //开灯事件 public class LightOn extends Event{ public LightOn(long delayTime) { super(delayTime); } public void action() { light = true; } public String toString(){ return "Light is on"; } } //关灯事件 public class LightOff extends Event{ public LightOff(long delayTime) { super(delayTime); } public void action() { light = false; } public String toString(){ return "Light is off"; } } //开水事件 public class WaterOn extends Event{ public WaterOn(long delayTime) { super(delayTime); } public void action() { water = true; } public String toString(){ return "Water is on"; } } //关水事件 public class WaterOff extends Event{ public WaterOff(long delayTime) { super(delayTime); } public void action() { water = false; } public String toString(){ return "Water is off"; } } //温度调节于晚上的事件 public class ThermostatNight extends Event{ public ThermostatNight(long delayTime) { super(delayTime); } public void action() { thermostat = "Night"; } public String toString(){ return "Therostat on night setting"; } } //温度调节于白天的事件 public class ThermostatDay extends Event{ public ThermostatDay(long delayTime) { super(delayTime); } public void action() { thermostat = "Day"; } public String toString(){ return "Therostat on day setting"; } } //响铃事件 public class Bell extends Event{ public Bell(long delayTime) { super(delayTime); } //响完铃之后又把一个new Bell(delayTime)加入都eventList public void action() { addEvent(new Bell(delayTime)); } public String toString(){ return "Bing!"; } } //重启事件 public class Restart extends Event{ private Event[] eventList; public Restart(long delayTime, Event[] eventList) { super(delayTime); this.eventList = eventList; for(int i = 0; i < eventList.length; i++){ addEvent(eventList[i]); } } public void action() { for(int i = 0; i < eventList.length; i++){ eventList[i].start();//重新启动每个事件。 addEvent(eventList[i]); } start();//启动当前Restart事件 addEvent(this);//把当前的Restart事件加入到eventList中,循环启动。 } public String toString(){ return "Restarting system!"; } } //终止事件 public class Terminate extends Event{ public Terminate(long delayTime) { super(delayTime); } public void action() { System.exit(0); } public String toString(){ return "Terminating!"; } } }
创建GreenhouseControls对象(“命令”设计模式的一个例子):
public class GreenhouseController { 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(400), gc.new WaterOn(600), gc.new WaterOff(800), gc.new ThermostatDay(1400) }; gc.addEvent(gc.new Restart(2000, eventList)); if(args.length == 0){ gc.addEvent(gc.new Terminate(5000)); } gc.run(); } }
运行结果:
以上内容整理自《Java编程思想》,若有遗漏,请您不吝指出!