標籤:style blog http java color os strong 資料
物件導向設計把握一個重要的經驗:誰擁有資料,誰就對外提供操作這些資料的方法。
案例是最好理解的,下面通過幾個案例來說明:
1.人在黑板上畫圓
通過這一句話很容易想到這幾個對象 person,blackboard,circle,接下來就是畫圓draw()這個方法的描述應該設計在哪個類身上呢?
要想畫出一個圓出來,我們得知道圓心和半徑,而這兩個資料是圓的,畫圓這個方法要操作圓心和半徑這兩個資料,根據我一開始的準則,這個方法應該設計成是圓提供的。
2.列車司機緊急刹車
思考:緊急刹車這個方法應該被設計在誰身上,是司機還是列車?
應該設計在列車上,因為刹車這個功能只有列車本身可以執行,司機只是調用了列車的刹車,然後列車在內部使列車實現刹車效果。
3.售貨員統計收穫小票的金額
思考:統計票金額是售票員的功能還是售貨票據的功能?
票的資訊在售貨票據身上,應該是售貨員對象調用售貨票據對象的getTotalMoney()方法,getTotalMoney()方法內部計算出售貨票據的總金額。
4.你把門關上了
門的關閉動作對於門這個具體類來說,是由一系列動作組成的,門的旋轉,靠到門框,鎖上,而這些具體的內容用物件導向思考的話,應該設計在門這個類身上,人只是調用了關門這個方法。
5.球從一根繩子的一段移動到了另一端
在這裡有兩個對象:球和繩子,對於球在繩子上的移動該如何表現?
從繩子的一端移動到另一端,也就是說球在繩子上的位移發生的變化,所以我們可以用球在繩子上的位子變化來表示球的移動過程,座標被定義在了繩子上,座標變動的這個方法只有繩子最清楚,設計在繩子上,傳回值就是下一個座標,球一開始就應該在一根繩子的某一個點上,通過球移動的方法其實是調用它所在的繩子的改變座標方法,代碼:
[java] view plaincopy
-
public class Rope
-
{
-
private Point start;
-
private Point end;
-
-
public Rope(Point start, Point end)
-
{
-
this.start = start;
-
this.end = end;
-
}
-
-
public Point nextPoint(Point currentPoint)
-
{
-
/*
-
* 通過兩點一線的數學公式可以計算出當前點的下一個點,這個細節不是設計階段要考慮的事情
-
* 如果當前點事終止點,則返回null,如果當前點不是線上的點,則拋出異常。
-
*/
-
return null;
-
}
-
}
-
-
class Ball
-
{
-
private Rope rope;
-
private Point currentPoint;
-
-
public Ball(Rope rope, Point currentPoint)
-
{
-
this.rope = rope;
-
this.currentPoint = currentPoint;
-
}
-
-
public void move()
-
{
-
currentPoint = rope.nextPoint(currentPoint);
-
System.out.println("小球移動到了" + currentPoint);
-
}
-
-
}
6.兩塊石頭磨成一把石刀,石刀可以砍樹,砍成木材,木材做成椅子
這個設計有點不同,因為找不到擁有的資料,更多的是一種生產關係
最先開始我們可以想到這些對象 Stone,StoneKnife,tree,material,chair.而對於具體的方法就有點困難了。
石頭變成石刀,Stone有一個方法把自己變成StoneKnife?那他自己豈不是沒了。這樣的設計是不合理的,因為在物件導向看來變成石刀不是石頭自己的特性。
在這裡我們這樣設計,定義個工廠來生產StoneKnife = KnifeFactory.createKnife(Stone first,Stone second).
對於材料 material = StoneKnife.cut(tree),對於木材可以變成椅子,也可以變成其他的,這樣變成什麼不是木材自己本身的特性了。
而對於木材不能說自己變成了椅子,又需要工廠Chair = ChairFactory.makeChair(material)
通過上面的這些案例,對於物件導向的設計有了感覺。首先我們得看具體的對象有哪些,然後每一個對象本身擁有的哪些屬性(資料),然後從更高層的抽象思維中思考對象之間的關係。