设计模式实例代码
一、接口類
接口類的實(shí)現(xiàn)主要為了接口化,歸一化,統(tǒng)一化,就是每個(gè)類的方法都是固定的名稱from abc import abstractmethod, ABCMetaclass Payment(metaclass=ABCMeta):
"""父類實(shí)現(xiàn)的方法加入子類繼承了必須實(shí)現(xiàn),否則報(bào)錯(cuò)"""@abstractmethoddef pay(self, money):passclass 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)
二、工廠類
from abc import abstractmethod, ABCMetaclass Payment(metaclass=ABCMeta):@abstractmethoddef pay(self, money):raise NotImplementedErrorclass Alipay(Payment):def __init__(self, enable_yuebao=False): #一個(gè)支付軟件可以有多種的支付方式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é),封裝了所有的支付方式,只是提供給用戶一個(gè)接口def create_payment(self, method):if method == "alipay":return Alipay() #調(diào)用Alipay() #模式使用支付寶elif method == "applepay":return ApplePay()elif method == "yuebao":return Alipay(True) #調(diào)用Alipay() 采用余額寶功能else:raise NameError(method)factory = PaymentFactory() #實(shí)例化工廠函數(shù) payment = factory.create_payment("yuebao") #調(diào)用工廠函數(shù)的方法 payment.pay(100) #根據(jù)用戶的選擇進(jìn)行支付三、工廠類的另一種實(shí)現(xiàn)方式
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)四、抽象工廠
from abc import abstractmethod, ABCMeta# ------抽象產(chǎn)品------ class PhoneShell(metaclass=ABCMeta): #生產(chǎn)手機(jī)殼的類@abstractmethoddef show_shell(self):passclass CPU(metaclass=ABCMeta): #生產(chǎn)CPU的類@abstractmethoddef show_cpu(self):passclass OS(metaclass=ABCMeta): #制作系統(tǒng)的類@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): #生產(chǎn)小的手機(jī)殼def show_shell(self):print("普通手機(jī)小手機(jī)殼")class BigShell(PhoneShell): #生產(chǎn)大的手機(jī)殼def show_shell(self):print("普通手機(jī)大手機(jī)殼")class AppleShell(PhoneShell): #生產(chǎn)蘋果手機(jī)殼def show_shell(self):print("蘋果手機(jī)殼")class SnapDragonCPU(CPU): #生產(chǎn)驍龍cpudef show_cpu(self):print("驍龍CPU")class MediaTekCPU(CPU): #生產(chǎn)聯(lián)發(fā)科cpudef show_cpu(self):print("聯(lián)發(fā)科CPU")class AppleCPU(CPU): #生產(chǎn)蘋果cpudef show_cpu(self):print("蘋果CPU")class Android(OS): #生產(chǎn)Android系統(tǒng)def show_os(self):print("Android系統(tǒng)")class IOS(OS):def show_os(self): #生產(chǎn)ios系統(tǒng)print("iOS系統(tǒng)")# ------具體工廠------ class MiFactory(PhoneFactory): #這個(gè)工廠生產(chǎn)驍龍cpudef make_cpu(self):return SnapDragonCPU()def make_os(self): #這個(gè)工廠制造安卓系統(tǒng)return Android()def make_shell(self): #這個(gè)手機(jī)制造大的手機(jī)殼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): #iPhone工廠def make_cpu(self):return AppleCPU()def make_os(self):return IOS()def make_shell(self):return AppleShell()# ------客戶端------ class Phone: #生產(chǎn)好的手機(jī)信息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): #生產(chǎn)手機(jī)cpu = factory.make_cpu()os = factory.make_os()shell = factory.make_shell()return Phone(cpu, os, shell)p1 = make_phone(IPhoneFactory()) #生產(chǎn)手機(jī)(iPhone制造工廠) p1.show_info() #展示制造好的手機(jī)
五、建造者模式
import random from abc import abstractmethod, ABCMeta#------產(chǎn)品------ class Player:"""生產(chǎn)一個(gè)玩具,這個(gè)玩具有頭,胳膊,身體,腿"""def __init__(self, face=None, body=None, arm=None, leg=None):self.face = faceself.arm = armself.leg = legself.body = bodydef __str__(self): #打印生產(chǎn)出來的人看效果return "%s, %s, %s, %s" % (self.face, self.arm, self.body, self.leg)#------建造者------ class PlayerBuilder(metaclass=ABCMeta):
"""負(fù)責(zé)生產(chǎn)人身體上的每個(gè)部件"""
@abstractmethoddef build_face(self):pass@abstractmethoddef build_arm(self):pass@abstractmethoddef build_leg(self):pass@abstractmethoddef build_body(self):pass@abstractmethoddef get_player(self):passclass BeautifulWomanBuilder(PlayerBuilder):
"""生產(chǎn)一個(gè)漂亮的小女孩"""def __init__(self):self.player = Player() #首先實(shí)例化工廠類,之后實(shí)現(xiàn)里面的每一個(gè)功能def build_face(self):self.player.face = "漂亮臉蛋"def build_arm(self):self.player.arm="細(xì)胳膊"def build_body(self):self.player.body="細(xì)腰"def build_leg(self):self.player.leg="長腿"def get_player(self):return self.playerclass RandomPlayerBuilder(PlayerBuilder):
"""生產(chǎn)一個(gè)即漂亮又難看的人"""def __init__(self):self.player = Player()def build_face(self):self.player.face = random.choice(["瓜子臉","西瓜子臉"])def build_arm(self):self.player.arm=random.choice(["長胳膊","短胳膊"])def build_body(self):self.player.body=random.choice(["苗條","胖"])def build_leg(self):self.player.leg=random.choice(["長腿","短腿"])def get_player(self):return self.playerclass PlayerDirector:def __init__(self, builder):self.builder = builder# 控制組裝順序def build_player(self):self.builder.build_body()self.builder.build_face()self.builder.build_arm()self.builder.build_leg()return self.builder.get_player()pd = PlayerDirector(RandomPlayerBuilder())#隨機(jī)生產(chǎn)一個(gè)人并組裝好零件 p = pd.build_player() print(p) #可以看到你已經(jīng)造好了一個(gè)玩具人了
六、單例模式
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)七、適配器模式
#適配器主要采用加殼的方式實(shí)現(xiàn)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 WechatPay:def huaqian(self, a, b):print("微信支付%s元"%(a+b))#------類適配器------ class RealWeChatPay(Payment, WechatPay):def pay(self, money):return self.huaqian(money, 0)#------對象適配器------ class PayAdapter(Payment):def __init__(self, payment):self.payment = paymentdef pay(self, money):return self.payment.huaqian(money, 0)#RealWeChatPay().pay(100) PayAdapter(WechatPay()).pay(1000)
八、混合模式
from abc import abstractmethod, ABCMetaclass Graphic(metaclass=ABCMeta):@abstractmethoddef draw(self):pass@abstractmethoddef add(self, graphic):pass@abstractmethoddef getchildren(self):passclass Point(Graphic):def __init__(self, x, y):self.x = xself.y = ydef draw(self):print(self)def add(self, graphic):raise TypeErrordef getchildren(self):raise TypeErrordef __str__(self):return "點(diǎn)(%s, %s)" % (self.x, self.y)class Line(Graphic):def __init__(self, p1, p2):self.p1 = p1self.p2 = p2def draw(self):print(self)def add(self, graphic):raise TypeErrordef getchildren(self):raise TypeErrordef __str__(self):return "線段[%s, %s]" % (self.p1, self.p2)class Picture(Graphic):def __init__(self):self.children = []def add(self, graphic):self.children.append(graphic)def getchildren(self):return self.childrendef draw(self):print("------復(fù)合圖形------")for g in self.children:g.draw()print("------END------")pic1 = Picture() pic1.add(Point(2,3)) pic1.add(Line(Point(1,2), Point(4,5))) pic1.add(Line(Point(0,1), Point(2,1)))pic2 = Picture() pic2.add(Point(-2,-1)) pic2.add(Line(Point(0,0), Point(1,1)))pic = Picture() pic.add(pic1) pic.add(pic2)pic.draw()九、代理模式
from abc import ABCMeta, abstractmethodclass Subject(metaclass=ABCMeta):@abstractmethoddef get_content(self):passclass RealSubject(Subject):def __init__(self, filename):self.filename = filenameprint("讀取%s文件內(nèi)容"%filename)f = open(filename)self.content = f.read()f.close()def get_content(self):return self.contentdef set_content(self, content):f = open(self.filename, 'w')f.write(content)f.close()class ProxyA(Subject):def __init__(self, filename):self.subj = RealSubject(filename)def get_content(self):return self.subj.get_content()class ProxyB(Subject):def __init__(self, filename):self.filename = filenameself.subj = Nonedef get_content(self):if not self.subj:self.subj = RealSubject(self.filename)return self.subj.get_content()class ProxyC(Subject):def __init__(self, filename):self.subj = RealSubject(filename)def get_content(self):return self.get_content()def set_content(self):raise PermissionError# 寫一個(gè)set_content b = ProxyB("abc.txt") #print(b.get_content())十、責(zé)任鏈模式
from abc import ABCMeta, abstractmethod # # class Handler(metaclass=ABCMeta): # @abstractmethod # def handle_leave(self, day): # pass # # # class GeneralManagerHandler(Handler): # def handle_leave(self, day): # if day < 10: # print("總經(jīng)理批準(zhǔn)%d天假"%day) # else: # print("呵呵") # # # class DepartmentManagerHandler(Handler): # def __init__(self): # self.successor = GeneralManagerHandler() # def handle_leave(self, day): # if day < 7: # print("部門經(jīng)理批準(zhǔn)%d天假"%day) # else: # print("部門經(jīng)理無權(quán)準(zhǔn)假") # self.successor.handle_leave(day) # # # class ProjectDirectorHandler(Handler): # def __init__(self): # self.successor = DepartmentManagerHandler() # def handle_leave(self, day): # if day < 3: # print("項(xiàng)目主管批準(zhǔn)%d天假") # else: # print("項(xiàng)目主管無權(quán)準(zhǔn)假") # self.successor.handle_leave(day) # # # day = 4 # h = ProjectDirectorHandler() # h.handle_leave(day) # #--高級例子--模仿js事件處理class Handler(metaclass=ABCMeta):@abstractmethoddef add_event(self, func):pass@abstractmethoddef handle(self):passclass BodyHandler(Handler):def __init__(self):self.func = Nonedef add_event(self, func):self.func = funcdef handle(self):if self.func:return self.func()else:print("已到最后一級,無法處理")class ElementHandler(Handler):def __init__(self, successor):self.func = Noneself.successor = successordef add_event(self, func):self.func = funcdef handle(self):if self.func:return self.func()else:return self.successor.handle()# 客戶端# <body><div><a> body = {'type': 'body', 'name': 'body', 'children': [], 'father': None}div = {'type': 'div', 'name': 'div', 'children': [], 'father': body}a = {'type': 'a', 'name': 'a', 'children': [], 'father': div}body['children'].append(div) div['children'].append(a)body['event_handler'] = BodyHandler() div['event_handler'] = ElementHandler(div['father']['event_handler']) a['event_handler'] = ElementHandler(a['father']['event_handler'])def attach_event(element, func):element['event_handler'].add_event(func)#testdef func_div():print("這是給div的函數(shù)")def func_a():print("這是給a的函數(shù)")def func_body():print("這是給body的函數(shù)")#attach_event(div, func_div) #attach_event(a, func_a) #attach_event(body, func_body) a['event_handler'].handle()十一、迭代器模式
class LinkList:"""鏈表 頭結(jié)點(diǎn)保存鏈表的長度"""class Node:def __init__(self, item=None):self.item = itemself.next = Noneclass LinkListIterator:def __init__(self, node):self.node = nodedef __next__(self):if self.node:cur_node = self.nodeself.node = cur_node.nextreturn cur_node.itemelse:raise StopIterationdef __iter__(self):return selfdef __init__(self, iterable=None):self.head = LinkList.Node(0)self.tail = self.headself.extend(iterable)def append(self, obj):s = LinkList.Node(obj)self.tail.next = sself.tail = sdef extend(self, iterable):for obj in iterable:self.append(obj)self.head.item += len(iterable)def __iter__(self):return self.LinkListIterator(self.head.next)def __len__(self):return self.head.itemdef __str__(self):return "<<"+", ".join(map(str, self))+">>"li = [i for i in range(100)] print(li) lk = LinkList(li) # for i in lk: # print(i)print(lk) # print(len(lk))十二、觀察者模式(發(fā)布者訂閱者模式)
from abc import ABCMeta, abstractmethodclass Observer(metaclass=ABCMeta):@abstractmethoddef update(self, notice):passclass Notice:def __init__(self):self.observers = [] # 記錄該主體的觀察者(訂閱者)def attach(self, obs):self.observers.append(obs)def detach(self, obs):obs.company_info = Noneself.observers.remove(obs)def notify(self):for obj in self.observers:obj.update(self)class ManagerNotice(Notice):def __init__(self, company_info=None):super().__init__()self.__company_info = company_info@propertydef company_info(self):return self.__company_info@company_info.setterdef company_info(self, info):self.__company_info = infoself.notify()class Manager(Observer):def __init__(self):self.company_info = Nonedef update(self, noti):self.company_info = noti.company_infonotice = ManagerNotice()alex = Manager() wusir = Manager()# print(alex.company_info) # print(wusir.company_info) notice.attach(alex) notice.attach(wusir) # notice.company_info="公司運(yùn)行良好" # print(alex.company_info) print(wusir.company_info) # notice.detach(wusir) # notice.company_info="公司要破產(chǎn)了"print(alex.company_info) print(wusir.company_info)十三、策略模式(代碼參照前邊的算法NB三人組)
from abc import ABCMeta, abstractmethod import randomclass Sort(metaclass=ABCMeta):@abstractmethoddef sort(self, data):passclass QuickSort(Sort):def quick_sort(self, data, left, right):if left < right:mid = self.partition(data, left, right)self.quick_sort(data, left, mid - 1)self.quick_sort(data, mid + 1, right)def partition(self, data, left, right):tmp = data[left]while left < right:while left < right and data[right] >= tmp:right -= 1data[left] = data[right]while left < right and data[left] <= tmp:left += 1data[right] = data[left]data[left] = tmpreturn leftdef sort(self, data):print("快速排序")return self.quick_sort(data, 0, len(data) - 1)class MergeSort(Sort):def merge(self, data, low, mid, high):i = lowj = mid + 1ltmp = []while i <= mid and j <= high:if data[i] <= data[j]:ltmp.append(data[i])i += 1else:ltmp.append(data[j])j += 1while i <= mid:ltmp.append(data[i])i += 1while j <= high:ltmp.append(data[j])j += 1data[low:high + 1] = ltmpdef merge_sort(self, data, low, high):if low < high:mid = (low + high) // 2self.merge_sort(data, low, mid)self.merge_sort(data, mid + 1, high)self.merge(data, low, mid, high)def sort(self, data):print("歸并排序")return self.merge_sort(data, 0, len(data) - 1)class Context:def __init__(self, data, strategy=None):self.data = dataself.strategy = strategydef set_strategy(self, strategy):self.strategy = strategydef do_strategy(self):if self.strategy:self.strategy.sort(self.data)else:raise TypeErrorli = list(range(100000)) random.shuffle(li)context = Context(li, MergeSort()) context.do_strategy() #print(context.data) random.shuffle(context.data)context.set_strategy(QuickSort()) context.do_strategy()十五、模板模式
from abc import ABCMeta, abstractmethodclass IOHandler(metaclass=ABCMeta):@abstractmethoddef open(self, name):pass@abstractmethoddef deal(self, change):pass@abstractmethoddef close(self):passdef process(self, name, change):self.open(name)self.deal(change)self.close()class FileHandler(IOHandler):接口隔離原則:
# 有些東西我有你沒有,你有我么有,這是就需要用到接口隔離# from abc import abstractmethod, ABCMeta # # class AnimalOnLand(metaclass=ABCMeta): # @abstractmethod # def walk(self): # pass # # class AnimalInSky(metaclass=ABCMeta): # @abstractmethod # def fly(self): # pass # # class AnimalInWater(metaclass=ABCMeta): # @abstractmethod # def swim(self): # pass # # class Tiger(AnimalOnLand): # pass # # class Frog(AnimalInWater, AnimalOnLand): # passclass A:def test(self):passclass B(A):passclass C:def __init__(self):self.a = A()self.a.test()
?
轉(zhuǎn)載于:https://www.cnblogs.com/52-qq/p/8407054.html
總結(jié)
- 上一篇: Python命令行神器 Click 入门
- 下一篇: poj3320 尺取法 挑战程序设计竞赛