日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

算法3-设计模式

發(fā)布時間:2024/4/17 asp.net 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法3-设计模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

設(shè)計模式六大原則

1、開閉原則:一個軟件實體如類、模塊和函數(shù)應(yīng)該對擴(kuò)展開放,對修改關(guān)閉。即軟件實體應(yīng)盡量在不修改原有代碼的情況下進(jìn)行擴(kuò)展。

2、里氏(Liskov)替換原則:所有引用基類(父類)的地方必須能透明地使用其子類的對象。

3、依賴倒置原則:高層模塊不應(yīng)該依賴低層模塊,二者都應(yīng)該依賴其抽象;抽象不應(yīng)該依賴細(xì)節(jié);細(xì)節(jié)應(yīng)該依賴抽象。換言之,要針對接口編程,而不是針對實現(xiàn)編程。

4、接口隔離原則:使用多個專門的接口,而不使用單一的總接口,即客戶端不應(yīng)該依賴那些它不需要的接口。

5、迪米特法則:一個軟件實體應(yīng)當(dāng)盡可能少地與其他實體發(fā)生相互作用。

6、單一職責(zé)原則:不要存在多于一個導(dǎo)致類變更的原因。通俗的說,即一個類只負(fù)責(zé)一項職責(zé)。

?

內(nèi)容:不直接向客戶端暴露對象創(chuàng)建的實現(xiàn)細(xì)節(jié),而是通過一個工廠類來負(fù)責(zé)創(chuàng)建產(chǎn)品類的實例。 角色: 工廠角色(Creator) 抽象產(chǎn)品角色(Product) 具體產(chǎn)品角色(Concrete Product) 優(yōu)點: 隱藏了對象創(chuàng)建的實現(xiàn)細(xì)節(jié) 客戶端不需要修改代碼 缺點: 違反了單一職責(zé)原則,將創(chuàng)建邏輯幾種到一個工廠類里 當(dāng)添加新產(chǎn)品時,需要修改工廠類代碼,違反了開閉原則 簡單工廠模式 from abc import abstractmethod, ABCMetaclass Payment(metaclass=ABCMeta):@abstractmethoddef pay(self, money):raise NotImplementedErrorclass Alipay(Payment):def __init__(self, enable_yuebao=False):self.enable_yuebao = enable_yuebaodef pay(self, money):if self.enable_yuebao:print("余額寶支付%s元" % money)else:print("支付寶支付%s元" % money)class ApplePay(Payment):def pay(self, money):print("蘋果支付%s元" % money)class PaymentFactory: # 工廠類 封裝了對象創(chuàng)建的細(xì)節(jié)def create_payment(self, method):if method == "alipay":return Alipay()elif method == "applepay":return ApplePay()elif method == "yuebao":return Alipay(True)else:raise NameError(method)factory = PaymentFactory() payment = factory.create_payment("yuebao") payment.pay(100) 代碼示例

?

內(nèi)容:定義一個用于創(chuàng)建對象的接口(工廠接口),讓子類決定實例化哪一個產(chǎn)品類。 角色: 抽象工廠角色(Creator) 具體工廠角色(Concrete Creator) 抽象產(chǎn)品角色(Product) 具體產(chǎn)品角色(Concrete Product)工廠方法模式相比簡單工廠模式將每個具體產(chǎn)品都對應(yīng)了一個具體工廠。適用場景: 需要生產(chǎn)多種、大量復(fù)雜對象的時候 需要降低耦合度的時候 當(dāng)系統(tǒng)中的產(chǎn)品種類需要經(jīng)常擴(kuò)展的時候 優(yōu)點: 每個具體產(chǎn)品都對應(yīng)一個具體工廠類,不需要修改工廠類代碼 隱藏了對象創(chuàng)建的實現(xiàn)細(xì)節(jié) 缺點: 每增加一個具體產(chǎn)品類,就必須增加一個相應(yīng)的具體工廠類 工廠方法模式 from abc import abstractmethod, ABCMetaclass Payment(metaclass=ABCMeta):@abstractmethoddef pay(self, money):raise NotImplementedErrorclass Alipay(Payment):def pay(self, money):print("支付寶支付%s元" % money)class ApplePay(Payment):def pay(self, money):print("蘋果支付%s元"%money)class PaymentFactory(metaclass=ABCMeta):@abstractmethoddef create_payment(self):passclass AlipayFactory(PaymentFactory):def create_payment(self):return Alipay()class ApplePayFactory(PaymentFactory):def create_payment(self):return ApplePay()# 用戶輸入 # 支付寶,120 af = AlipayFactory() ali = af.create_payment() ali.pay(120) 示例代碼

?

內(nèi)容:定義一個工廠類接口,讓工廠子類來創(chuàng)建一系列相關(guān)或相互依賴的對象。 例:生產(chǎn)一部手機(jī),需要手機(jī)殼、CPU、操作系統(tǒng)三類對象進(jìn)行組裝,其中每類對象都有不同的種類。對每個具體工廠,分別生產(chǎn)一部手機(jī)所需要的三個對象。 角色: 抽象工廠角色(Creator) 具體工廠角色(Concrete Creator) 抽象產(chǎn)品角色(Product) 具體產(chǎn)品角色(Concrete Product) 客戶端(Client) 相比工廠方法模式,抽象工廠模式中的每個具體工廠都生產(chǎn)一套產(chǎn)品。 適用場景: 系統(tǒng)要獨立于產(chǎn)品的創(chuàng)建與組合時 強(qiáng)調(diào)一系列相關(guān)的產(chǎn)品對象的設(shè)計以便進(jìn)行聯(lián)合使用時 提供一個產(chǎn)品類庫,想隱藏產(chǎn)品的具體實現(xiàn)時 優(yōu)點: 將客戶端與類的具體實現(xiàn)相分離 每個工廠創(chuàng)建了一個完整的產(chǎn)品系列,使得易于交換產(chǎn)品系列 有利于產(chǎn)品的一致性(即產(chǎn)品之間的約束關(guān)系) 缺點: 難以支持新種類的(抽象)產(chǎn)品 抽象工廠模式 from abc import abstractmethod, ABCMeta# ------抽象產(chǎn)品------class PhoneShell(metaclass=ABCMeta):@abstractmethoddef show_shell(self):passclass CPU(metaclass=ABCMeta):@abstractmethoddef show_cpu(self):passclass OS(metaclass=ABCMeta):@abstractmethoddef show_os(self):pass# ------抽象工廠------class PhoneFactory(metaclass=ABCMeta):@abstractmethoddef make_shell(self):pass@abstractmethoddef make_cpu(self):pass@abstractmethoddef make_os(self):pass# ------具體產(chǎn)品------class SmallShell(PhoneShell):def show_shell(self):print("普通手機(jī)小手機(jī)殼")class BigShell(PhoneShell):def show_shell(self):print("普通手機(jī)大手機(jī)殼")class AppleShell(PhoneShell):def show_shell(self):print("蘋果手機(jī)殼")class SnapDragonCPU(CPU):def show_cpu(self):print("驍龍CPU")class MediaTekCPU(CPU):def show_cpu(self):print("聯(lián)發(fā)科CPU")class AppleCPU(CPU):def show_cpu(self):print("蘋果CPU")class Android(OS):def show_os(self):print("Android系統(tǒng)")class IOS(OS):def show_os(self):print("iOS系統(tǒng)")# ------具體工廠------class MiFactory(PhoneFactory):def make_cpu(self):return SnapDragonCPU()def make_os(self):return Android()def make_shell(self):return BigShell()class HuaweiFactory(PhoneFactory):def make_cpu(self):return MediaTekCPU()def make_os(self):return Android()def make_shell(self):return SmallShell()class IPhoneFactory(PhoneFactory):def make_cpu(self):return AppleCPU()def make_os(self):return IOS()def make_shell(self):return AppleShell()# ------客戶端------class Phone:def __init__(self, cpu, os, shell):self.cpu = cpuself.os = osself.shell = shelldef show_info(self):print("手機(jī)信息:")self.cpu.show_cpu()self.os.show_os()self.shell.show_shell()def make_phone(factory):cpu = factory.make_cpu()os = factory.make_os()shell = factory.make_shell()return Phone(cpu, os, shell)p1 = make_phone(IPhoneFactory()) p1.show_info() 示例代碼

?

內(nèi)容:保證一個類只有一個實例,并提供一個訪問它的全局訪問點。 角色: 單例(Singleton) 適用場景 當(dāng)類只能有一個實例而且客戶可以從一個眾所周知的訪問點訪問它時 優(yōu)點: 對唯一實例的受控訪問 單例相當(dāng)于全局變量,但防止了命名空間被污染 與單例模式功能相似的概念:全局變量、靜態(tài)變量(方法) 單例模式 from abc import abstractmethod, ABCMetaclass Singleton(object):def __new__(cls, *args, **kwargs):if not hasattr(cls, "_instance"):cls._instance = super(Singleton, cls).__new__(cls)return cls._instanceclass MyClass(Singleton):def __init__(self, name=None):if name is not None:self.name = namea = MyClass("a")print(a) print(a.name)b = MyClass("b")print(b) print(b.name)print(a) print(a.name) 示例代碼

?

轉(zhuǎn)載于:https://www.cnblogs.com/fenglin0826/p/8447266.html

總結(jié)

以上是生活随笔為你收集整理的算法3-设计模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。