上接《Java編程思想》之為什麼需要內部類?
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)加入都eventListpublic 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編程思想》,若有遺漏,請您不吝指出!