这段时间比较空闲,所以就抽出一些时间自己做了一个扫雷的小游戏。期间深有感触,现总结如下:
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的方法
其类图如下:
在扩展空点与信息点的时候,我为了避免递归造成的低效率和高空间,使用了一个自己想出来的水波算法,其核心思想就是,扩展的时候以点击点为基点作出类似于水波扩展一样的空点与信息点的判断,这样更加有目的性,避免了大量的时空开销。在扩展的时候要分出来转角点与普通扩展点,然后再判断是否为雷点。这个算法的思想不是很难但是对于边界情况的判断比较复杂。