這段時間比較空閑,所以就抽出一些時間自己做了一個掃雷的小游戲。期間深有感觸,現總結如下:
    1、這個是我從設計開始完全采用面向對象思想的程序,鍛煉了我面向對象的設計能力。
    2、其中對Observer Pattern、Adapter Pattern、Factory Pattern等設計模式進行了應用,加深了對設計模式的理解,也感受到了設計模式帶來的好處。
    3、熟悉了Java之中Swing的編程模式。
    4、理解了面向對象設計法則之中的開放-封閉法則(OCP)的優點。
下面對其中一些感觸比較深的地方進行敘述。
    開閉法則:
    ·開閉法則認為我們應該試圖是設計出永遠也不需要改變的模塊。
    ·我們可以添加新代碼來擴展系統的行為。我們不能對已有的代碼進行修改。
    ·符合OCP的模塊需要滿足兩個標準:
       1、可擴展,即“對擴展是開放的”(Open for Extension)  模塊的行為可以被擴展,以需要滿足新的需求。
       2、不可改變,即“對更改是封閉的”(Closed for Modification)模塊的源代碼是不允許進行改動的。
    我們如何去做呢?
    ·抽象(Abstraction)
    ·多態(Polymorphism)
    ·繼承(Inheritance)
    ·接口(Interface)   
    一個軟件系統的所有模塊不可能都滿足OCP,但是我們應該努力最小化這些不滿足OCP的模塊數量。
    開閉法則是OO真正的核心。
    符合該法則便意味著最高等級的復用性(reusability)和可維護性(maintainability)。

    當時我在考慮做雷點的時候,沒有多想就直接考慮swing的jbutton了,因為它已經設計好了事件的接受處理方法,并且可以直接調用,這個就是直接使用了開閉法則,對我們開發非常有利。
    在編制過程之中如何取得panel之中的特定位置點的button也是困擾我的一個問題,也是由于自己以前對swing不是很熟的原因,后來認真看了關于swing layout方面的書之后知道了,我是用的gridlayout可以取得特定index的對象。
    之后困擾我的是,如何在button響應事件之中作出相應的處理,由于新new了一個nest anonymous class this對象無法獲取之上的對象。思考過后就用到了下面的Observer Pattern解決這個問題。
    Observer Pattern的所有參與者:

    ConcreteSubject(具體目標)參與者:
    ConcreteSubject參與者表示實際“被觀察的一方(目標)”的參與者。一旦狀態有變化,就會立即通知已登錄的Observer參與者。扮演這個角色的是MinePanel類。

    Observer(觀察者)參與者:
    參與者是被Subject參與者通知“狀態有變化”的參與者。通知的方法是update。扮演這個角色的是Observer接口。

    ConcreteObserver(具體觀察者)參與者

    ConcreteObserver參與者是實際的Observer。一調用update方法時,既可以從該方法取得Subject的目前狀態。扮演這個角色的是SweepMineWindow類。
   
    Subject狀態有變化
    |
    通知Observer
    |
    Observer調用Subject的方法
  

    其類圖如下:



    在擴展空點與信息點的時候,我為了避免遞歸造成的低效率和高空間,使用了一個自己想出來的水波算法,其核心思想就是,擴展的時候以點擊點為基點作出類似于水波擴展一樣的空點與信息點的判斷,這樣更加有目的性,避免了大量的時空開銷。在擴展的時候要分出來轉角點與普通擴展點,然后再判斷是否為雷點。這個算法的思想不是很難但是對于邊界情況的判斷比較復雜。