设计模式:讲在设计模式之前
一、什么是設計模式
1、設計模式的定義
2、注意事項
設計模式就是底層實現起來麻煩,上層調用簡單
設計模式就是“有一個套路 ,分幾個類,幾個方法,幾個屬性”
3、為什么要有設計模式
在面向對象之前用的面向過程,小軟件,需求不斷增加,代碼量爆增,大家的代碼合并不了,幾百萬幾千萬的項目都不能交付,爆發了軟件危機,才有了軟件工程,設計模式,面向對象
二、講在設計模式之前
1、封裝
?1、對象的行為對于外部世界來說就是不可見的,或者說對象的狀態信息是私密的
?2、客戶端不能通過直接操作來改變對象的內部狀態。相反,客戶端需要通過發送消息來請求對象改變其內部狀態。對象可以根據請求的類型,通過特定的成員函數(例get和set)改變他們的內部狀態,
以做出相應的響應
?3、在python中,封裝(數據和方法的隱藏)的概念不是隱式的,因為它沒有提供封裝所需的關鍵字,諸如public、private和protected(在諸如c++或java之類的語言匯總,都提供了這些關鍵字)
當然,如果在變量或函數名 前加上前綴_,就可以將其可訪問性變為私有
4、私有屬性很重要
2、繼承
多態的兩種類型
對象根據輸入參數提供方法的不同實現
不同類型的對象可以使用相同的接口
對于python來說,多態是該語言的內置功能,例如操作符"+"可以應用于兩個整數以進行加法運算,也可以應用于字符串來連接它們。在下面的示例中,字符串、元祖或列表都可以通過證書索引進行訪問
它為我們展示了python內置類型的多態
B是一種特殊的A才會用繼承
3、多態
Python是一種多態語言,程序員不用考慮多態
4、接口
一種特殊的類,聲明了若干方法,要求繼承該接口的類必須實現這些方法。
作用:限制繼承接口的類的方法的名稱及調用方式;隱藏了類的內部實現。
接口就是一種抽象的基類(父類),限制繼承它的類必須實現接口中定義的某些方法
1、用接口專業代碼
from abc import abstractmethod, ABCMeta#抽象 class Payment(metaclass=ABCMeta):@abstractmethoddef 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)#高層
payment = Alipay
payment.pay(100)
?2、新人代碼
class WeiXinZhiFu:def huaqian(self, money):print("微信支付%s元"%money)class WangYinzhiFu:def huaqian(self, money):print("網銀支付%s元"%money)5、組合
它是一種將對象或類組合成更復雜的數據結構或軟件實現的方法
在組合中,一個對象可用于條用其他模塊中的成員函數,這樣一來,無序通過集成就可以實現基本功能的跨模塊作用
四、設計模式6大原則
1、開閉原則
一個軟件實體如類、模塊和函數應該對擴展開放,對修改關閉。即軟件實體應盡量在不修改原有代碼的情況下進行擴展
白話:加功能可以很方便的加,改代碼盡量不要改?
python中的裝飾器就用的是開閉原則
2、里氏(Liskov)替換原則
所有引用基類(父類)的地方必須能透明地使用其子類的對象。
傳父類ok,之類也應該不會報錯有問題,也就是之類不能覆蓋父類
尤其在“替換父類代碼的時候”
3、依賴倒置原則
高層模塊不應該依賴低層模塊,二者都應該依賴其抽象;抽象不應該依賴細節;細節應該依賴抽象。換言之,要針對接口編程,而不是針對實現編程
高層和底層不直接依賴,高層依賴底層 底層和高層不是一個人寫的,底層修改,高層也要修改,抽象就是接口編程
1、用接口專業代碼
from abc import abstractmethod, ABCMeta#抽象接口 class Payment(metaclass=ABCMeta):@abstractmethoddef 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 = paymentdef pay(self, money):if hasattr(self, "pay"):return self.payment.pay(money)else:return self.payment.huaqian(money)轉載于:https://www.cnblogs.com/luoahong/p/9732898.html
總結
以上是生活随笔為你收集整理的设计模式:讲在设计模式之前的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C-Lodop回调函数的触发
- 下一篇: LibreOj 6279数列分块入门 3