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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

asp.net

算法3-设计模式

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

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

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

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

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

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

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

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

?

內(nèi)容:不直接向客戶端暴露對(duì)象創(chuàng)建的實(shí)現(xiàn)細(xì)節(jié),而是通過(guò)一個(gè)工廠類來(lái)負(fù)責(zé)創(chuàng)建產(chǎn)品類的實(shí)例。 角色: 工廠角色(Creator) 抽象產(chǎn)品角色(Product) 具體產(chǎn)品角色(Concrete Product) 優(yōu)點(diǎn): 隱藏了對(duì)象創(chuàng)建的實(shí)現(xiàn)細(xì)節(jié) 客戶端不需要修改代碼 缺點(diǎn): 違反了單一職責(zé)原則,將創(chuàng)建邏輯幾種到一個(gè)工廠類里 當(dāng)添加新產(chǎn)品時(shí),需要修改工廠類代碼,違反了開(kāi)閉原則 簡(jiǎ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: # 工廠類 封裝了對(duì)象創(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)容:定義一個(gè)用于創(chuàng)建對(duì)象的接口(工廠接口),讓子類決定實(shí)例化哪一個(gè)產(chǎn)品類。 角色: 抽象工廠角色(Creator) 具體工廠角色(Concrete Creator) 抽象產(chǎn)品角色(Product) 具體產(chǎn)品角色(Concrete Product)工廠方法模式相比簡(jiǎn)單工廠模式將每個(gè)具體產(chǎn)品都對(duì)應(yīng)了一個(gè)具體工廠。適用場(chǎng)景: 需要生產(chǎn)多種、大量復(fù)雜對(duì)象的時(shí)候 需要降低耦合度的時(shí)候 當(dāng)系統(tǒng)中的產(chǎn)品種類需要經(jīng)常擴(kuò)展的時(shí)候 優(yōu)點(diǎn): 每個(gè)具體產(chǎn)品都對(duì)應(yīng)一個(gè)具體工廠類,不需要修改工廠類代碼 隱藏了對(duì)象創(chuàng)建的實(shí)現(xiàn)細(xì)節(jié) 缺點(diǎn): 每增加一個(gè)具體產(chǎn)品類,就必須增加一個(gè)相應(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)容:定義一個(gè)工廠類接口,讓工廠子類來(lái)創(chuàng)建一系列相關(guān)或相互依賴的對(duì)象。 例:生產(chǎn)一部手機(jī),需要手機(jī)殼、CPU、操作系統(tǒng)三類對(duì)象進(jìn)行組裝,其中每類對(duì)象都有不同的種類。對(duì)每個(gè)具體工廠,分別生產(chǎn)一部手機(jī)所需要的三個(gè)對(duì)象。 角色: 抽象工廠角色(Creator) 具體工廠角色(Concrete Creator) 抽象產(chǎn)品角色(Product) 具體產(chǎn)品角色(Concrete Product) 客戶端(Client) 相比工廠方法模式,抽象工廠模式中的每個(gè)具體工廠都生產(chǎn)一套產(chǎn)品。 適用場(chǎng)景: 系統(tǒng)要獨(dú)立于產(chǎn)品的創(chuàng)建與組合時(shí) 強(qiáng)調(diào)一系列相關(guān)的產(chǎn)品對(duì)象的設(shè)計(jì)以便進(jìn)行聯(lián)合使用時(shí) 提供一個(gè)產(chǎn)品類庫(kù),想隱藏產(chǎn)品的具體實(shí)現(xiàn)時(shí) 優(yōu)點(diǎn): 將客戶端與類的具體實(shí)現(xiàn)相分離 每個(gè)工廠創(chuàng)建了一個(gè)完整的產(chǎn)品系列,使得易于交換產(chǎn)品系列 有利于產(chǎn)品的一致性(即產(chǎn)品之間的約束關(guān)系) 缺點(diǎ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)容:保證一個(gè)類只有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)。 角色: 單例(Singleton) 適用場(chǎng)景 當(dāng)類只能有一個(gè)實(shí)例而且客戶可以從一個(gè)眾所周知的訪問(wèn)點(diǎn)訪問(wèn)它時(shí) 優(yōu)點(diǎn): 對(duì)唯一實(shí)例的受控訪問(wèn) 單例相當(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-设计模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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