設計模式:講在設計模式之前
一、什麽是設計模式
1、設計模式的定義
2、註意事項
設計模式就是底層實現起來麻煩,上層調用簡單
設計模式就是“有一個套路 ,分幾個類,幾個方法,幾個屬性”
3、為什麽要有設計模式
在面向對象之前用的面向過程,小軟件,需求不斷增加,代碼量爆增,大家的代碼合並不了,幾百萬幾千萬的項目都不能交付,爆發了軟件危機,才有了軟件工程,設計模式,面向對象
二、講在設計模式之前
1、封裝
1、對象的行為對於外部世界來說就是不可見的,或者說對象的狀態信息是私密的
2、客戶端不能通過直接操作來改變對象的內部狀態。相反,客戶端需要通過發送消息來請求對象改變其內部狀態。對象可以根據請求的類型,通過特定的成員函數(例get和set)改變他們的內部狀態,
以做出相應的響應
3、在python中,封裝(數據和方法的隱藏)的概念不是隱式的,因為它沒有提供封裝所需的關鍵字,諸如public、private和protected(在諸如c++或java之類的語言匯總,都提供了這些關鍵字)
當然,如果在變量或函數名 前加上前綴_,就可以將其可訪問性變為私有
4、私有屬性很重要
2、繼承
多態的兩種類型
對象根據輸入參數提供方法的不同實現
不同類型的對象可以使用相同的接口
對於python來說,多態是該語言的內置功能,例如操作符"+"可以應用於兩個整數以進行加法運算,也可以應用於字符串來連接它們。在下面的示例中,字符串、元祖或列表都可以通過證書索引進行訪問
它為我們展示了python內置類型的多態
B是一種特殊的A才會用繼承
3、多態
Python是一種多態語言,程序員不用考慮多態
4、接口
一種特殊的類,聲明了若幹方法,要求繼承該接口的類必須實現這些方法。
作用:限制繼承接口的類的方法的名稱及調用方式;隱藏了類的內部實現。
接口就是一種抽象的基類(父類),限制繼承它的類必須實現接口中定義的某些方法
5、組合
它是一種將對象或類組合成更復雜的數據結構或軟件實現的方法
在組合中,一個對象可用於條用其他模塊中的成員函數,這樣一來,無序通過集成就可以實現基本功能的跨模塊作用
四、設計模式6大原則
1、開閉原則
一個軟件實體如類、模塊和函數應該對擴展開放,對修改關閉。即軟件實體應盡量在不修改原有代碼的情況下進行擴展
白話:加功能可以很方便的加,改代碼盡量不要改?
python中的裝飾器就用的是開閉原則
2、裏氏(Liskov)替換原則
所有引用基類(父類)的地方必須能透明地使用其子類的對象。
傳父類ok,之類也應該不會報錯有問題,也就是之類不能覆蓋父類
尤其在“替換父類代碼的時候”
3、依賴倒置原則
高層模塊不應該依賴低層模塊,二者都應該依賴其抽象;抽象不應該依賴細節;細節應該依賴抽象。換言之,要針對接口編程,而不是針對實現編程
高層和底層不直接依賴,高層依賴底層 底層和高層不是一個人寫的,底層修改,高層也要修改,抽象就是接口編程
代
1、用接口專業代碼
from abc import abstractmethod, ABCMeta class Payment(metaclass=ABCMeta): @abstractmethod def pay(self, money): raise NotImplementedError class Alipay(Payment): def pay(self, money): print("支付寶支付%s元"%money) class ApplePay(Payment): def pay(self, money): print("蘋果支付%s元"%money) class WechatPay(Payment): def pay(self, money): print("微信支付%s元"%money)
2、新人代碼
class WeiXinZhiFu: def huaqian(self, money): print("微信支付%s元"%money) class WangYinzhiFu: def huaqian(self, money): print("網銀支付%s元"%money)
4、接口隔離原則
使用多個專門的接口,而不使用單一的總接口,即客戶端不應該依賴那些它不需要的接口。
就是不要亂繼承:只有B是一種特殊的A才會用繼承
5、迪米特法則
一個軟件實體應當盡可能少地與其他實體發生相互作用
解偶
6、單一職責原則
不要存在多於一個導致類變更的原因。通俗的說,即一個類只負責一項職責。
7、合成復用原則
1、類適配器 用的是繼承
class WeChatPay(Payment, WeiXinZhiFu): def pay(self, money): self.huaqian(money)
2、對象適配器------用的是組合
class PayAdapter(Payment): def __init__(self, payment): self.payment = payment def pay(self, money): if hasattr(self, "pay"): return self.payment.pay(money) else: return self.payment.huaqian(money)
設計模式:講在設計模式之前