近年來
大家都開始注意設計模式
那麼
到底我們為什麼要用設計模式呢?這麼多設計模式為什麼要這麼設計呢?說實話
以前我還真沒搞清楚
就是看大家一口一個
Design pattern
心就有點發虛
於是就買了本
四人幫
的設計模式
結果看得似懂非懂:看得時候好像是懂了
過一會就忘了
可能是本人比較
愚鈍
吧:))最近
有了點感悟
獨樂不如眾樂
與大家分享一下
還望指教!
為什麼要提倡
Design Pattern
呢?根本原因是為了代碼復用
增加可維護性
那麼怎麼才能實現代碼復用呢?OO界有前輩的幾個原則
開-閉
原則(Open Closed Principal)
裡氏代換原則
合成復用原則
設計模式就是實現了這些原則
從而達到了代碼復用
增加可維護性的目的
一
開-閉
原則
此原則是由
Bertrand Meyer
提出的
原文是
Software entities should be open for extension
but closed for modification
就是說模塊應對擴展開放
而對修改關閉
模塊應盡量在不修改原(是
原
指原來的代碼)代碼的情況下進行擴展
那麼怎麼擴展呢?我們看工廠模式
factory pattern
:假設中關村有一個賣盜版盤和毛片的小子
我們給他設計一
光盤銷售管理軟件
我們應該先設計一
光盤
接口
如圖
而盜版盤和毛片是其子類
小子通過
DiscFactory
來管理這些光盤
代碼為
public class DiscFactory{ public static 光盤 getDisc(String name){ return (光盤)Class
forName(name)
getInstance(); }}
有人要買盜版盤
怎麼實現呢?
public class 小子{ public static void main(String[] args){ 光盤 d=DiscFactory
getDisc(
盜版盤
); 光盤
賣(); }}
如果有一天
這小子良心發現了
開始賣正版軟件
沒關系
我們只要再創建一個
光盤
的子類
正版軟件
就可以了
不需要修改原結構和代碼
怎麼樣?對擴展開發
對修改關閉
開
閉原則
工廠模式是對具體產品進行擴展
有的項目可能需要更多的擴展性
要對這個
工廠
也進行擴展
那就成了
抽象工廠模式
二
裡氏代換原則
裡氏代換原則是由
Barbara Liskov
提出的
如果調用的是父類的話
那麼換成子類也完全可以運行
比如
光盤 d=new 盜版盤();
d
賣();
現在要將
盜版盤
類改為
毛片
類
沒問題
完全可以運行
Java編譯程序會檢查程序是否符合裡氏代換原則
還記得java繼承的一個原則嗎?子類overload方法的訪問權限不能小於父類對應方法的訪問權限
比如
光盤
中的方法
賣
訪問權限是
public
那麼
盜版盤
和
毛片
中的
賣
方法就不能是package或private
編譯不能通過
為什麼要這樣呢?你想啊
如果
盜版盤
的
賣
方法是private
那麼下面這段代碼就不能執行了
光盤 d=new 盜版盤();
d
賣();
可以說
裡氏代換原則是繼承復用的一個基礎
三
合成復用原則
就是說要少用繼承
多用合成關系來實現
我曾經這樣寫過程序
有幾個類要與數據庫打交道
就寫了一個數據庫操作的類
然後別的跟數據庫打交道的類都繼承這個
結果後來
我修改了數據庫操作類的一個方法
各個類都需要改動
牽一發而動全身
!面向對象是要把波動限制在盡量小的范圍
在Java中
應盡量針對Interface編程
而非實現類
這樣
更換子類不會影響調用它方法的代碼
要讓各個類盡可能少的跟別人聯系
不要與陌生人說話
這樣
城門失火
才不至於殃及池魚
擴展性和維護性才能提高
理解了這些原則
再看設計模式
只是在具體問題上怎麼實現這些原則而已
張無忌學太極拳
忘記了所有招式
打倒了
玄冪二老
所謂
心中無招
設計模式可謂招數
如果先學通了各種模式
又忘掉了所有模式而隨心所欲
可謂OO之最高境界
呵呵
搞笑
搞笑!
這是我的一點心得
大家可能理解得更深刻
還望指教!
From:http://tw.wingwit.com/Article/program/Java/gj/201311/11159.html