《Java編程思想》之更好瞭解內部類的價值(一個簡單的例子)

來源:互聯網
上載者:User

上接《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編程思想》,若有遺漏,請您不吝指出!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.