物件導向的思考

來源:互聯網
上載者:User

標籤:style   blog   http   java   color   os   strong   資料   

物件導向設計把握一個重要的經驗:誰擁有資料,誰就對外提供操作這些資料的方法。

案例是最好理解的,下面通過幾個案例來說明:

1.人在黑板上畫圓

通過這一句話很容易想到這幾個對象 person,blackboard,circle,接下來就是畫圓draw()這個方法的描述應該設計在哪個類身上呢?

要想畫出一個圓出來,我們得知道圓心和半徑,而這兩個資料是圓的,畫圓這個方法要操作圓心和半徑這兩個資料,根據我一開始的準則,這個方法應該設計成是圓提供的。

2.列車司機緊急刹車

思考:緊急刹車這個方法應該被設計在誰身上,是司機還是列車?

應該設計在列車上,因為刹車這個功能只有列車本身可以執行,司機只是調用了列車的刹車,然後列車在內部使列車實現刹車效果。

3.售貨員統計收穫小票的金額

思考:統計票金額是售票員的功能還是售貨票據的功能?

票的資訊在售貨票據身上,應該是售貨員對象調用售貨票據對象的getTotalMoney()方法,getTotalMoney()方法內部計算出售貨票據的總金額。

4.你把門關上了

門的關閉動作對於門這個具體類來說,是由一系列動作組成的,門的旋轉,靠到門框,鎖上,而這些具體的內容用物件導向思考的話,應該設計在門這個類身上,人只是調用了關門這個方法。

5.球從一根繩子的一段移動到了另一端

在這裡有兩個對象:球和繩子,對於球在繩子上的移動該如何表現?

從繩子的一端移動到另一端,也就是說球在繩子上的位移發生的變化,所以我們可以用球在繩子上的位子變化來表示球的移動過程,座標被定義在了繩子上,座標變動的這個方法只有繩子最清楚,設計在繩子上,傳回值就是下一個座標,球一開始就應該在一根繩子的某一個點上,通過球移動的方法其實是調用它所在的繩子的改變座標方法,代碼:

[java] view plaincopy

  1. public class Rope  

  2. {  

  3.     private Point start;  

  4.     private Point end;  

  5.   

  6.     public Rope(Point start, Point end)  

  7.     {  

  8.         this.start = start;  

  9.         this.end = end;  

  10.     }  

  11.   

  12.     public Point nextPoint(Point currentPoint)  

  13.     {  

  14.         /* 

  15.          * 通過兩點一線的數學公式可以計算出當前點的下一個點,這個細節不是設計階段要考慮的事情 

  16.          * 如果當前點事終止點,則返回null,如果當前點不是線上的點,則拋出異常。 

  17.          */  

  18.         return null;  

  19.     }  

  20. }  

  21.   

  22. class Ball  

  23. {  

  24.     private Rope rope;  

  25.     private Point currentPoint;  

  26.   

  27.     public Ball(Rope rope, Point currentPoint)  

  28.     {  

  29.         this.rope = rope;  

  30.         this.currentPoint = currentPoint;  

  31.     }  

  32.   

  33.     public void move()  

  34.     {  

  35.         currentPoint = rope.nextPoint(currentPoint);  

  36.         System.out.println("小球移動到了" + currentPoint);  

  37.     }  

  38.   

  39. }  

6.兩塊石頭磨成一把石刀,石刀可以砍樹,砍成木材,木材做成椅子

這個設計有點不同,因為找不到擁有的資料,更多的是一種生產關係

最先開始我們可以想到這些對象 Stone,StoneKnife,tree,material,chair.而對於具體的方法就有點困難了。

石頭變成石刀,Stone有一個方法把自己變成StoneKnife?那他自己豈不是沒了。這樣的設計是不合理的,因為在物件導向看來變成石刀不是石頭自己的特性。

在這裡我們這樣設計,定義個工廠來生產StoneKnife = KnifeFactory.createKnife(Stone first,Stone second).

對於材料 material =  StoneKnife.cut(tree),對於木材可以變成椅子,也可以變成其他的,這樣變成什麼不是木材自己本身的特性了。

而對於木材不能說自己變成了椅子,又需要工廠Chair = ChairFactory.makeChair(material)



通過上面的這些案例,對於物件導向的設計有了感覺。首先我們得看具體的對象有哪些,然後每一個對象本身擁有的哪些屬性(資料),然後從更高層的抽象思維中思考對象之間的關係。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.