精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Python的設(shè)計(jì)模式:構(gòu)建更優(yōu)雅的代碼

開(kāi)發(fā) 后端
Python的設(shè)計(jì)模式是一種有關(guān)如何解決特定問(wèn)題或設(shè)計(jì)靈活可維護(hù)代碼的指導(dǎo)原則。設(shè)計(jì)模式是開(kāi)發(fā)者們多年經(jīng)驗(yàn)的總結(jié),可以在面對(duì)各種軟件設(shè)計(jì)挑戰(zhàn)時(shí)提供有力的解決方案。

設(shè)計(jì)模式是在軟件工程中廣泛使用的經(jīng)驗(yàn)豐富的解決問(wèn)題的方法。它們是通用的、可重復(fù)使用的解決方案,用于解決常見(jiàn)的設(shè)計(jì)問(wèn)題。設(shè)計(jì)模式有助于使代碼更易于理解、可維護(hù)和可擴(kuò)展。Python作為一門(mén)多范式的編程語(yǔ)言,提供了豐富的設(shè)計(jì)模式應(yīng)用場(chǎng)景。

在本文中,我們將詳細(xì)介紹 Python 中的各種設(shè)計(jì)模式,包括創(chuàng)建型、結(jié)構(gòu)型和行為型模式。

創(chuàng)建型模式

創(chuàng)建型模式關(guān)注對(duì)象的創(chuàng)建機(jī)制,它們包括單例、工廠(chǎng)、抽象工廠(chǎng)、建造者和原型模式。這些模式旨在提供一種靈活的方式來(lái)創(chuàng)建對(duì)象,同時(shí)減少對(duì)象創(chuàng)建的復(fù)雜性。

單例模式

單例模式確保一個(gè)類(lèi)只有一個(gè)實(shí)例,并提供一個(gè)全局訪(fǎng)問(wèn)點(diǎn)。這對(duì)于需要在應(yīng)用程序中共享資源的情況非常有用,例如配置管理、日志記錄和數(shù)據(jù)庫(kù)連接。

示例代碼:

class Singleton:
    _instance = None
    
    def __new__(cls):
        if cls._instance is None:
            cls._instance = super(Singleton, cls).__new__(cls)
        return cls._instance

# 使用單例模式
singleton1 = Singleton()
singleton2 = Singleton()
print(singleton1 is singleton2)  # 輸出:True

單例模式確保只創(chuàng)建一個(gè)實(shí)例,即使多次創(chuàng)建也返回相同的實(shí)例。

工廠(chǎng)模式

工廠(chǎng)模式用于創(chuàng)建對(duì)象,將對(duì)象的創(chuàng)建邏輯封裝在一個(gè)方法中,從而實(shí)現(xiàn)對(duì)象的創(chuàng)建和使用的解耦。工廠(chǎng)模式可以根據(jù)傳入的參數(shù)選擇創(chuàng)建哪種類(lèi)型的對(duì)象。

示例代碼:

class Dog:
    def __init__(self, name):
        self.name = name

class Cat:
    def __init__(self, name):
        self.name = name

class AnimalFactory:
    def create_animal(self, animal_type, name):
        if animal_type == "dog":
            return Dog(name)
        elif animal_type == "cat":
            return Cat(name)

# 使用工廠(chǎng)模式
factory = AnimalFactory()
dog = factory.create_animal("dog", "Buddy")
cat = factory.create_animal("cat", "Whiskers")

工廠(chǎng)模式將對(duì)象創(chuàng)建的邏輯封裝在一個(gè)工廠(chǎng)類(lèi)中,客戶(hù)端可以根據(jù)需要?jiǎng)?chuàng)建不同類(lèi)型的對(duì)象。

抽象工廠(chǎng)模式

抽象工廠(chǎng)模式提供了一種創(chuàng)建相關(guān)對(duì)象家族的方式,而無(wú)需指定它們的具體類(lèi)。這允許創(chuàng)建一組相關(guān)對(duì)象,例如不同操作系統(tǒng)下的窗口和按鈕。

示例代碼:

class Button:
    def display(self):
        pass

class Window:
    def display(self):
        pass

class MacOSButton(Button):
    def display(self):
        print("MacOS Button")

class LinuxButton(Button):
    def display(self):
        print("Linux Button")

class MacOSWindow(Window):
    def display(self):
        print("MacOS Window")

class LinuxWindow(Window):
    def display(self):
        print("Linux Window")

class GUIFactory:
    def create_button(self):
        pass

    def create_window(self):
        pass

class MacOSFactory(GUIFactory):
    def create_button(self):
        return MacOSButton()

    def create_window(self):
        return MacOSWindow()

class LinuxFactory(GUIFactory):
    def create_button(self):
        return LinuxButton()

    def create_window(self):
        return LinuxWindow()

# 使用抽象工廠(chǎng)模式
macos_factory = MacOSFactory()
linux_factory = LinuxFactory()

macos_button = macos_factory.create_button()
linux_window = linux_factory.create_window()

macos_button.display()  # 輸出:MacOS Button
linux_window.display()  # 輸出:Linux Window

抽象工廠(chǎng)模式創(chuàng)建一組相關(guān)的對(duì)象,例如在不同操作系統(tǒng)下使用不同樣式的界面組件。

建造者模式

建造者模式將一個(gè)復(fù)雜對(duì)象的構(gòu)建過(guò)程分解為一系列步驟,使客戶(hù)端能夠按步驟構(gòu)建對(duì)象。這對(duì)于構(gòu)建包含許多可選組件的對(duì)象非常有用。

示例代碼:

class Pizza:
    def __init__(self, size, cheese, pepperoni, mushrooms):
        self.size = size
        self.cheese = cheese
        self.pepperoni = pepperoni
        self.mushrooms = mushrooms

class PizzaBuilder:
    def __init__(self, size):
        self.size = size
        self.cheese = False
        self.pepperoni = False
        self.mushrooms = False

    def add_cheese(self):
        self.cheese = True
        return self

    def add_pepperoni(self):
        self.pepperoni = True
        return self

    def add_mushrooms(self):
        self.mushrooms = True
        return self

    def build(self):
        return Pizza(self.size, self.cheese, self.pepperoni, self.mushrooms)

# 使用建造者模式
pizza = PizzaBuilder(12).add_cheese().add_pepperoni().build()

建造者模式逐步構(gòu)建一個(gè)對(duì)象,設(shè)置其屬性并最終構(gòu)建對(duì)象。這對(duì)于構(gòu)建參數(shù)眾多的對(duì)象非常有用。

原型模式

原型模式通過(guò)復(fù)制現(xiàn)有對(duì)象來(lái)創(chuàng)建新對(duì)象。這對(duì)于創(chuàng)建大型對(duì)象或需要定制初始化的對(duì)象非常有用。原型模式可以克隆一個(gè)現(xiàn)有對(duì)象,而無(wú)需從頭創(chuàng)建一個(gè)新對(duì)象。

示例代碼:

import copy

class Prototype:
    def __init__(self):
        self.items = []

    def clone(self):
        return copy.deepcopy(self)

# 使用原型模式
original = Prototype()
original.items.append("item1")

# 克隆原型對(duì)象
clone = original.clone()
clone.items.append("item2")

print(original.items)  # 輸出:['item1']
print(clone.items)     # 輸出:['item1', 'item2']

原型模式可以克隆對(duì)象,能夠在不從頭創(chuàng)建對(duì)象的情況下生成新對(duì)象。

結(jié)構(gòu)型模式

結(jié)構(gòu)型模式處理對(duì)象之間的關(guān)系,包括適配器、橋接、組合、裝飾器、外觀(guān)、享元和代理模式。這些模式有助于定義對(duì)象之間的協(xié)作方式,同時(shí)保持系統(tǒng)的靈活性和可維護(hù)性。

適配器模式

適配器模式用于將一個(gè)接口轉(zhuǎn)換成另一個(gè)接口,以使不兼容的類(lèi)可以一起工作。適配器模式使用不同接口的對(duì)象協(xié)同工作。

示例代碼:

class OldSystem:
    def operation(self):
        return "Old System"

class NewSystem:
    def operation(self):
        return "New System"

class Adapter:
    def __init__(self, new_system):
        self.new_system = new_system

    def operation(self):
        return f"Adapter using {self.new_system.operation()}"

# 使用適配器模式
new_system = NewSystem()
adapter = Adapter(new_system)

result = adapter.operation()
print(result)  # 輸出:Adapter using New System

適配器模式允許新舊系統(tǒng)一起工作,將新系統(tǒng)的接口適配為舊系統(tǒng)可以使用的接口。

橋接模式

橋接模式將抽象部分與實(shí)現(xiàn)部分分離,它們可以獨(dú)立變化。這有助于減少類(lèi)之間的耦合,同時(shí)允許它們?cè)谶\(yùn)行時(shí)獨(dú)立變化。

示例代碼:

class DrawingAPI:
    def draw_circle(self, x, y, radius):
        pass

class DrawingAPI1(DrawingAPI):
    def draw_circle(self, x, y, radius):
        print(f"API1.circle at {x}:{y} radius {radius}")

class DrawingAPI2(DrawingAPI):
    def draw_circle(self, x, y, radius):
        print(f"API2.circle at {x}:{y} radius {radius}")

class Shape:
    def __init__(self, drawing_api):
        self.drawing_api = drawing_api

    def draw(self):
        pass

class Circle(Shape):
    def __init__(self, x, y, radius, drawing_api):
        super().__init__(drawing_api)
        self.x = x
        self.y = y
        self.radius = radius

    def draw(self):
        self.drawing_api.draw_circle(self.x, self.y, self.radius)

# 使用橋接模式
api1 = DrawingAPI1()
api2 = DrawingAPI2()

circle1 = Circle(1, 2, 3, api1)
circle1.draw()  # 輸出

:API1.circle at 1:2 radius 3

circle2 = Circle(4, 5, 6, api2)
circle2.draw()  # 輸出:API2.circle at 4:5 radius 6

橋接模式將抽象形狀和繪制API分開(kāi),使它們可以獨(dú)立變化。這有助于降低系統(tǒng)的復(fù)雜性。

組合模式

組合模式用于將對(duì)象組織成樹(shù)狀結(jié)構(gòu),以表示部分-整體關(guān)系。這使得客戶(hù)端可以統(tǒng)一處理單個(gè)對(duì)象和組合對(duì)象,從而簡(jiǎn)化代碼。

示例代碼:

class Component:
    def operation(self):
        pass

class Leaf(Component):
    def operation(self):
        return "Leaf"

class Composite(Component):
    def __init__(self):
        self.children = []

    def add(self, component):
        self.children.append(component)

    def operation(self):
        results = []
        for child in self.children:
            results.append(child.operation())
        return f"Composite [{', '.join(results)}]"

# 使用組合模式
leaf1 = Leaf()
leaf2 = Leaf()
composite = Composite()
composite.add(leaf1)
composite.add(leaf2)

result = composite.operation()
print(result)  # 輸出:Composite [Leaf, Leaf]

組合模式允許構(gòu)建包含子組件的復(fù)雜對(duì)象,同時(shí)使客戶(hù)端能夠一致地處理單個(gè)對(duì)象和組合對(duì)象。

裝飾器模式

裝飾器模式動(dòng)態(tài)地將責(zé)任附加到對(duì)象上。它是在不修改對(duì)象源代碼的情況下擴(kuò)展對(duì)象功能的一種方式。

示例代碼:

class Coffee:
    def cost(self):
        return 5

class MilkDecorator:
    def __init__(self, coffee):
        self._coffee = coffee

    def cost(self):
        return self._coffee.cost() + 2

class SugarDecorator:
    def __init__(self, coffee):
        self._coffee = coffee

    def cost(self):
        return self._coffee.cost() + 1

# 使用裝飾器模式
coffee = Coffee()
print(coffee.cost())  # 輸出:5

coffee_with_milk = MilkDecorator(coffee)
print(coffee_with_milk.cost())  # 輸出:7

coffee_with_milk_and_sugar = SugarDecorator(coffee_with_milk)
print(coffee_with_milk_and_sugar.cost())  # 輸出:8

裝飾器模式在運(yùn)行時(shí)動(dòng)態(tài)地添加新功能或修改對(duì)象的行為。

外觀(guān)模式

外觀(guān)模式提供了一個(gè)統(tǒng)一的接口,用于訪(fǎng)問(wèn)子系統(tǒng)中的一組接口。這簡(jiǎn)化了復(fù)雜子系統(tǒng)的使用,為客戶(hù)端提供了一個(gè)簡(jiǎn)化的接口。

示例代碼:

class SubsystemA:
    def operation_a(self):
        return "Subsystem A operation"

class SubsystemB:
    def operation_b(self):
        return "Subsystem B operation"

class SubsystemC:
    def operation_c(self):
        return "Subsystem C operation"

class Facade:
    def __init__(self):
        self.subsystem_a = SubsystemA()
        self.subsystem_b = SubsystemB()
        self.subsystem_c = SubsystemC()

    def operation(self):
        result = []
        result.append(self.subsystem_a.operation_a())
        result.append(self.subsystem_b.operation_b())
        result.append(self.subsystem_c.operation_c())
        return "\n".join(result)

# 使用外觀(guān)模式
facade = Facade()
result = facade.operation()
print(result)

外觀(guān)模式提供了一個(gè)高級(jí)接口,使客戶(hù)端能夠訪(fǎng)問(wèn)一組子系統(tǒng)接口,而不必了解其復(fù)雜性。

享元模式

享元模式用于共享大量細(xì)粒度對(duì)象,以減少內(nèi)存占用。它將對(duì)象的共享部分抽象出來(lái),以減少對(duì)象的數(shù)量。

示例代碼:

class Flyweight:
    def operation(self):
        pass

class ConcreteFlyweight(Flyweight):
    def __init__(self, intrinsic_state):
        self._intrinsic_state = intrinsic_state

    def operation(self):
        return f"Concrete Flyweight: {self._intrinsic_state}"

class FlyweightFactory:
    def __init__(self):
        self._flyweights = {}

    def get_flyweight(self, key):
        if key not in self._flyweights:
            self._flyweights[key] = ConcreteFlyweight(key)
        return self._flyweights[key]

# 使用享元模式
factory = FlyweightFactory()
flyweight1 = factory.get_flyweight("A")
flyweight2 = factory.get_flyweight("B")

print(flyweight1.operation())  # 輸出:Concrete Flyweight: A
print(flyweight2.operation())  # 輸出:Concrete Flyweight: B

享元模式允許多個(gè)對(duì)象共享相同的內(nèi)部狀態(tài),從而降低內(nèi)存占用。

代理模式

代理模式允許創(chuàng)建一個(gè)代理對(duì)象,用于控制對(duì)其他對(duì)象的訪(fǎng)問(wèn)。代理對(duì)象充當(dāng)被代理對(duì)象的接口,以便在不直接訪(fǎng)問(wèn)被代理對(duì)象的情況下執(zhí)行其他操作。

示例代碼:

class Subject:
    def operation(self):
        pass

class RealSubject(Subject):
    def operation(self):
        return "Real Subject operation"

class Proxy(Subject):
    def __init__(self):
        self._real_subject = RealSubject()

    def operation(self):
        return f"Proxy operation, {self._real_subject.operation()}"

# 使用代理模式
proxy = Proxy()
result = proxy.operation()
print(result)  # 輸出:Proxy operation, Real Subject operation

代理模式允許代理對(duì)象控制對(duì)真實(shí)對(duì)象的訪(fǎng)問(wèn),從而提供附加的功能或控制。

行為型模式

行為型模式處理對(duì)象之間的通信,包括觀(guān)察者、策略、命令、責(zé)任鏈、狀態(tài)、訪(fǎng)問(wèn)者、迭代器、備忘錄、中介者、解釋器和模板方法模式。這些模式有助于定義對(duì)象之間的交互和職責(zé)分配。

觀(guān)察者模式

觀(guān)察者模式定義了一種一對(duì)多的依賴(lài)關(guān)系,其中一個(gè)對(duì)象的狀態(tài)發(fā)生變化時(shí),其所有依賴(lài)對(duì)象都會(huì)得到通知。

示例代碼:

class Subject:
    def __init__(self):
        self._observers = []

    def attach(self, observer):
        self._observers.append(observer)

    def detach(self, observer):
        self._observers.remove(observer)

    def notify(self):
        for observer in self._observers:
            observer.update()

class ConcreteSubject(Subject):
    def __init__(self, state):
        super().__init__()
        self._state = state

    def get_state(self):
        return self._state

    def set_state(self, state):
        self._state = state
        self.notify()

class Observer:
    def update(self):
        pass

class ConcreteObserver(Observer):
    def __init__(self, subject):
        self._subject = subject
        self._state = subject.get_state()

    def update(self):
        self._state = self._subject.get_state()

# 使用觀(guān)察者模式
subject = ConcreteSubject("initial state")
observer1 = ConcreteObserver(subject)
observer2 = ConcreteObserver(subject)

subject.attach(observer1)
subject.attach(observer2)

print(observer1._state)  # 輸出:initial state
print(observer2._state)  # 輸出:initial state

subject.set_state("new state")

print(observer1._state)  # 輸出:new state
print(observer2._state)  # 輸出:new state

觀(guān)察者模式允許主題對(duì)象和觀(guān)察者對(duì)象之間保持松散的耦合,主題對(duì)象的狀態(tài)變化會(huì)自動(dòng)通知觀(guān)察者對(duì)象。

策略模式

策略模式定義了一系列算法,封裝每個(gè)算法,并使它們可以相互替換。這提供了靈活性,允許在運(yùn)行時(shí)選擇算法。

示例代碼:

class Strategy:
    def execute(self, a, b):
        pass

class AddStrategy(Strategy):
    def execute(self, a, b):
        return a + b

class SubtractStrategy(Strategy):
    def execute(self, a, b):
        return a - b

class Calculator:
    def __init__(self, strategy):
        self._strategy = strategy

    def execute(self, a, b):
        return self._strategy.execute(a, b)

# 使用策略模式
add_strategy = AddStrategy()
sub_strategy = SubtractStrategy()

calculator = Calculator(add_strategy)
result = calculator.execute(5, 3)
print(result)  # 輸出:8

calculator = Calculator(sub_strategy)
result = calculator.execute(5, 3)
print(result)  # 輸出:2

策略模式允許定義一組算法,并將它們封裝在可互換的策略對(duì)象中,以便在運(yùn)行時(shí)選擇不同的算法。

命令模式

命令模式將請(qǐng)求封裝成一個(gè)對(duì)象,從而可以參數(shù)化客戶(hù)端對(duì)象操作,隊(duì)列請(qǐng)求或記錄請(qǐng)求日志。

示例代碼:

class Receiver:
    def action(self):
        pass

class Light(Receiver):
    def action(self):
        print("Light is on")

class Stereo(Receiver):
    def action(self):
        print("Stereo is on")

class Command:
    def __init__(self, receiver):
        self._receiver = receiver

    def execute(self):
        pass

class LightOnCommand(Command):
    def execute(self):
        self._receiver.action()

class StereoOnCommand(Command):
    def execute(self):
        self._receiver.action()

class RemoteControl:
    def __init__(self):
        self._commands = []

    def add_command(self, command):
        self._commands.append(command)

    def execute_commands(self):
        for command in self._commands:
            command.execute()

# 使用命令模式
light = Light()
stereo = Stereo()

light_on_command = LightOnCommand(light)
stereo_on_command = StereoOnCommand(stereo)

remote = RemoteControl()
remote.add_command(light_on_command)
remote.add_command(stereo_on_command)

remote.execute_commands()
# 輸出:
# Light is on
# Stereo is on

命令模式將請(qǐng)求和處理請(qǐng)求的對(duì)象解耦,允許將命令存儲(chǔ)、排隊(duì)和操作。

責(zé)任鏈模式

責(zé)任鏈模式構(gòu)建一系列對(duì)象,每個(gè)對(duì)象負(fù)責(zé)處理請(qǐng)求的一部分。請(qǐng)求按順序通過(guò)鏈傳遞,直到有一個(gè)對(duì)象處理它為止。

示例代碼:

class Handler:
    def set_successor(self, successor):
        self._successor = successor

    def handle_request(self, request):
        pass

class ConcreteHandler1(Handler):
    def handle_request(self, request):
        if request == "A":
            return "Handled by Handler1"
        elif self._successor:
            return self._successor.handle_request(request)
        else:
            return "Request not handled"

class ConcreteHandler2(Handler):
    def handle_request(self, request):
        if request == "B":
            return "Handled by Handler2"
        elif self._successor:
            return self._successor.handle_request(request)
        else:
            return "Request not handled"

# 使用責(zé)任鏈模式
handler1 = ConcreteHandler1()
handler2 = ConcreteHandler2()

handler1.set_successor(handler2)

result1 = handler1.handle_request("A")
print(result1)  # 輸出:Handled by Handler1

result2 = handler1.handle_request("B")
print(result2)  # 輸出:Handled by Handler2

result3 = handler1.handle_request("C")
print(result3)  # 輸出:Request not handled

責(zé)任鏈模式允許構(gòu)建對(duì)象鏈,其中每個(gè)對(duì)象決定是否處理請(qǐng)求或?qū)⑵鋫鬟f給下一個(gè)對(duì)象。

狀態(tài)模式

狀態(tài)模式允許對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變其行為。這將狀態(tài)轉(zhuǎn)移邏輯封裝在不同的狀態(tài)類(lèi)中。

示例代碼:

class State:
    def handle(self):
        pass

class StateA(State):
    def handle(self):
        return "State A"

class StateB(State):
    def handle(self):
        return "State B"

class Context:
    def __init__(self):
        self._state = None

    def set_state(self, state):
        self._state = state

    def request(self):
        return self._state.handle()

# 使用狀態(tài)模式
context = Context()
state_a = StateA()
state_b = StateB()

context.set_state(state_a)
result1 = context.request()
print(result1)  # 輸出:State A



context.set_state(state_b)
result2 = context.request()
print(result2)  # 輸出:State B

狀態(tài)模式允許對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變其行為,從而使其看起來(lái)像是更改了類(lèi)。

訪(fǎng)問(wèn)者模式

訪(fǎng)問(wèn)者模式允許在不修改對(duì)象結(jié)構(gòu)的情況下為對(duì)象結(jié)構(gòu)中的元素添加新操作。它通過(guò)將訪(fǎng)問(wèn)操作從元素類(lèi)中分離出來(lái)來(lái)實(shí)現(xiàn)這一點(diǎn)。

示例代碼:

class Element:
    def accept(self, visitor):
        pass

class ConcreteElementA(Element):
    def accept(self, visitor):
        visitor.visit_concrete_element_a(self)

class ConcreteElementB(Element):
    def accept(self, visitor):
        visitor.visit_concrete_element_b(self)

class Visitor:
    def visit_concrete_element_a(self, element):
        pass

    def visit_concrete_element_b(self, element):
        pass

class ConcreteVisitor(Visitor):
    def visit_concrete_element_a(self, element):
        return f"Visited {element.__class__.__name__} by {self.__class__.__name__}"

    def visit_concrete_element_b(self, element):
        return f"Visited {element.__class__.__name__} by {self.__class__.__name__}"

# 使用訪(fǎng)問(wèn)者模式
element_a = ConcreteElementA()
element_b = ConcreteElementB()
visitor = ConcreteVisitor()

result1 = element_a.accept(visitor)
print(result1)  # 輸出:Visited ConcreteElementA by ConcreteVisitor

result2 = element_b.accept(visitor)
print(result2)  # 輸出:Visited ConcreteElementB by ConcreteVisitor

訪(fǎng)問(wèn)者模式將元素和訪(fǎng)問(wèn)操作分離,為元素添加新操作而無(wú)需修改元素類(lèi)。

迭代器模式

迭代器模式在不暴露集合的內(nèi)部表示的情況下順序訪(fǎng)問(wèn)集合的元素。

示例代碼:

class Iterator:
    def next(self):
        pass

class Aggregate:
    def create_iterator(self):
        pass

class ConcreteIterator(Iterator):
    def __init__(self, collection):
        self._collection = collection
        self._index = 0

    def next(self):
        if self._index < len(self._collection):
            item = self._collection[self._index]
            self._index += 1
            return item
        else:
            raise StopIteration()

class ConcreteAggregate(Aggregate):
    def __init__(self):
        self._collection = []

    def create_iterator(self):
        return ConcreteIterator(self._collection)

    def add_item(self, item):
        self._collection.append(item)

# 使用迭代器模式
aggregate = ConcreteAggregate()
aggregate.add_item("Item 1")
aggregate.add_item("Item 2")
aggregate.add_item("Item 3")

iterator = aggregate.create_iterator()

while True:
    try:
        item = iterator.next()
        print(item)
    except StopIteration:
        break

迭代器模式順序訪(fǎng)問(wèn)集合的元素,而無(wú)需暴露其內(nèi)部表示。

備忘錄模式

備忘錄模式用于捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),以便以后可以將其恢復(fù)到該狀態(tài)。它將對(duì)象狀態(tài)的保存和恢復(fù)分離開(kāi)來(lái)。

示例代碼:

class Memento:
    def __init__(self, state):
        self._state = state

    def get_state(self):
        return self._state

class Originator:
    def __init__(self):
        self._state = ""

    def set_state(self, state):
        self._state = state

    def create_memento(self):
        return Memento(self._state)

    def restore_memento(self, memento):
        self._state = memento.get_state()

class Caretaker:
    def __init__(self):
        self._mementos = []

    def add_memento(self, memento):
        self._mementos.append(memento)

    def get_memento(self, index):
        return self._mementos[index]

# 使用備忘錄模式
originator = Originator()
caretaker = Caretaker()

originator.set_state("State 1")
caretaker.add_memento(originator.create_memento())

originator.set_state("State 2")
caretaker.add_memento(originator.create_memento())

originator.restore_memento(caretaker.get_memento(0))
print(originator._state)  # 輸出:State 1

originator.restore_memento(caretaker.get_memento(1))
print(originator._state)  # 輸出:State 2

備忘錄模式保存對(duì)象的狀態(tài),并在需要時(shí)將其恢復(fù)到以前的狀態(tài)。

中介者模式

中介者模式用于減少對(duì)象之間的直接通信,將對(duì)象之間的交互集中到中介者對(duì)象中。這有助于減少對(duì)象之間的耦合。

示例代碼:

class Mediator:
    def send(self, message, colleague):
        pass

class Colleague:
    def __init__(self, mediator):
        self._mediator = mediator

    def send(self, message):
        self._mediator.send(message, self)

class ConcreteMediator(Mediator):
    def __init__(self, colleague1, colleague2):
        self._colleague1 = colleague1
        self._colleague2 = colleague2

    def send(self, message, colleague):
        if colleague == self._colleague1:
            self._colleague2.receive(message)
        else:
            self._colleague1.receive(message)

class ConcreteColleague1(Colleague):
    def receive(self, message):
        print(f"Colleague 1 received: {message}")

class ConcreteColleague2(Colleague):
    def receive(self, message):
        print(f"Colleague 2 received: {message}")

# 使用中介者模式
colleague1 = ConcreteColleague1(None)
colleague2 = ConcreteColleague2(None)

mediator = ConcreteMediator(colleague1, colleague2)
colleague1._mediator = mediator
colleague2._mediator = mediator

colleague1.send("Hello from Colleague 1")
colleague2.send("Hi from Colleague 2")

中介者模式將對(duì)象之間的通信集中到中介者對(duì)象中,減少了對(duì)象之間的直接耦合。

解釋器模式

解釋器模式用于定義一門(mén)語(yǔ)言的語(yǔ)法,以解釋語(yǔ)言中的句子。它將語(yǔ)法規(guī)則和解釋邏輯分開(kāi)。

示例代碼:

class Expression:
    def interpret(self):
        pass

class TerminalExpression(Expression):
    def __init__(self, data):
        self._data = data

    def interpret(self):
        if self._data in ["LiteralA", "LiteralB"]:
            return True
        return False

class OrExpression(Expression):
    def __init__(self, expression1, expression2):
        self._expression1 = expression1
        self._expression2 = expression2

    def interpret(self):
        return self._expression1.interpret() or self._expression2.interpret()

class AndExpression(Expression):
    def __init__(self, expression1, expression2):
        self._expression1 = expression1
        self._expression2 = expression2

    def interpret(self):
        return self._expression1.interpret() and self._expression2.interpret()

# 使用解釋器模式
expression1 = TerminalExpression("LiteralA")
expression2 = TerminalExpression("LiteralB")
or_expression = OrExpression(expression1, expression2)
and_expression = AndExpression(expression1, expression2)

result1 = or_expression.interpret()
print(result1)  # 輸出:True

result2 = and_expression.interpret()
print(result2)  # 輸出:True

解釋器模式定義一門(mén)語(yǔ)言的語(yǔ)法,并為語(yǔ)言中的句子創(chuàng)建解釋器。

模板方法模式

模板方法模式定義了一個(gè)算法的骨架,將算法的一些步驟推遲到子類(lèi)中。這允許子類(lèi)在不改變算法結(jié)構(gòu)的情況下重新定義算法的某些步驟。

示例代碼:

class AbstractClass:
    def template_method(self):
        self.operation1()
        self.operation2()

    def operation1(self):
        pass

    def operation2(self):
        pass

class ConcreteClass1(AbstractClass):
    def operation1(self):
        print("ConcreteClass1: Operation 1")

    def operation2(self):
        print("ConcreteClass1: Operation 2")

class ConcreteClass2(AbstractClass):
    def operation1(self):
        print("ConcreteClass2: Operation 1")

    def operation2(self):
        print("ConcreteClass2: Operation 2")

# 使用模板方法模式
concrete1 = ConcreteClass1()
concrete1.template_method()
# 輸出:
# ConcreteClass1: Operation 1
# ConcreteClass1: Operation 2

concrete2 = ConcreteClass2()
concrete2.template_method()
# 輸出:
# ConcreteClass2: Operation 1
# ConcreteClass2: Operation 2

模板方法模式定義了一個(gè)算法的骨架,允許子類(lèi)提供實(shí)現(xiàn)特定步驟的方法。

結(jié)論

Python的設(shè)計(jì)模式是一種有關(guān)如何解決特定問(wèn)題或設(shè)計(jì)靈活可維護(hù)代碼的指導(dǎo)原則。設(shè)計(jì)模式是開(kāi)發(fā)者們多年經(jīng)驗(yàn)的總結(jié),可以在面對(duì)各種軟件設(shè)計(jì)挑戰(zhàn)時(shí)提供有力的解決方案。

創(chuàng)建型設(shè)計(jì)模式處理對(duì)象的創(chuàng)建,包括單例、工廠(chǎng)、抽象工廠(chǎng)、建造者和原型模式。這些模式可以靈活地管理對(duì)象的生命周期和創(chuàng)建過(guò)程。

結(jié)構(gòu)型設(shè)計(jì)模式有助于組織和管理對(duì)象之間的關(guān)系,包括適配器、裝飾器、代理、組合、橋接、享元和外觀(guān)模式。它們構(gòu)建更靈活和可維護(hù)的系統(tǒng)。

行為型設(shè)計(jì)模式處理對(duì)象之間的通信和協(xié)作,包括觀(guān)察者、策略、命令、責(zé)任鏈、狀態(tài)、訪(fǎng)問(wèn)者、迭代器、備忘錄、中介者、解釋器和模板方法模式。這些模式有助于定義對(duì)象之間的交互和協(xié)作方式。

設(shè)計(jì)模式可以提高代碼的可讀性、可維護(hù)性和可擴(kuò)展性。選擇適當(dāng)?shù)脑O(shè)計(jì)模式可以使開(kāi)發(fā)過(guò)程更高效,減少錯(cuò)誤,并降低系統(tǒng)復(fù)雜性。然而,要根據(jù)具體問(wèn)題和需求來(lái)選擇和實(shí)現(xiàn)設(shè)計(jì)模式,而不是機(jī)械地應(yīng)用它們。在實(shí)際開(kāi)發(fā)中,理解設(shè)計(jì)模式的核心概念和原則將成為更出色的軟件工程師。

責(zé)任編輯:姜華 來(lái)源: 今日頭條
相關(guān)推薦

2025-02-12 08:04:54

代碼Ordersetter

2022-05-13 08:48:50

React組件TypeScrip

2023-12-21 10:26:30

??Prettier

2020-04-03 14:55:39

Python 代碼編程

2022-03-11 12:14:43

CSS代碼前端

2022-03-08 06:41:35

css代碼

2025-02-10 00:25:00

命令模式擴(kuò)展機(jī)制系統(tǒng)

2023-11-02 09:02:55

Java模式

2023-11-23 13:50:00

Python代碼

2025-09-10 07:15:00

Python編程語(yǔ)言對(duì)象編程

2021-12-13 14:37:37

React組件前端

2024-01-23 11:21:24

2022-04-10 10:41:17

ESLint異步代碼

2021-12-07 08:16:34

React 前端 組件

2019-09-29 16:17:25

Java代碼性能編程語(yǔ)言

2018-07-12 14:20:33

SQLSQL查詢(xún)編寫(xiě)

2021-12-29 17:24:16

Kubernetes集群事件

2021-06-25 15:53:25

Kubernetes程序技巧

2024-07-30 14:09:19

裝飾器Python代碼

2022-09-27 15:34:05

VSCode插件開(kāi)發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

久久视频在线观看| 亚洲天堂手机| 成人精品视频网站| 欧美亚洲成人免费| 国产精品久久久免费看| 亚洲图色一区二区三区| 福利二区91精品bt7086| 亚洲国产精品www| 性做久久久久久久| 日韩精品每日更新| 欧美国产中文字幕| 最近中文字幕在线mv视频在线 | 4438全国亚洲精品在线观看视频| 久久久久亚洲av无码a片| 激情视频亚洲| 欧美性受xxxx| 九九爱精品视频| 日本中文字幕在线2020| 97se亚洲国产综合自在线观| 91色视频在线观看| 蜜臀尤物一区二区三区直播| 激情综合在线| www日韩欧美| 六月婷婷七月丁香| 动漫av一区| 欧美一区二区三区啪啪| 免费电影一区| 亚洲成人在线免费| 国产亚洲观看| 精品成人久久久| 青青草久久网络| 精品剧情在线观看| 奇米精品一区二区三区在线观看一 | 最新的欧美黄色| 国产精品嫩草69影院| 国产综合色激情| 欧美性20hd另类| 亚洲理论电影在线观看| 在线免费观看a视频| 国产精品国产三级国产普通话蜜臀| 欧美福利精品| 午夜性色福利视频| 99视频精品免费视频| 99国产高清| 精品国产av一区二区| 国产一区二区导航在线播放| 成人黄色大片在线免费观看| 国产精品国产三级国产aⅴ| 美腿丝袜亚洲三区| 国产主播欧美精品| 91亚洲精品国偷拍自产在线观看 | 国产精品88久久久久久| 在线观看日韩www视频免费| 国产精成人品免费观看| 精品少妇av| 亚洲色图13p| 婷婷色一区二区三区| 红桃视频在线观看一区二区| 亚洲一区二区精品| 大胸美女被爆操| 欧美hentaied在线观看| 日韩有码在线视频| 欧美爱爱小视频| 国内精品久久久久国产盗摄免费观看完整版 | 一边摸一边做爽的视频17国产| 99国产精品免费网站| 精品成人一区二区| 欧美日韩国产免费| 丝袜a∨在线一区二区三区不卡| 精品亚洲二区| 欧美在线免费| 久久久国产91| 欧美黄片一区二区三区| 亚洲大黄网站| 日本三级久久久| 久久午夜鲁丝片| 久久97超碰国产精品超碰| 成人动漫网站在线观看| 亚洲精品国产一区二| 99久久免费精品| 欧洲亚洲一区二区| 天堂а√在线资源在线| 一区二区三区四区中文字幕| 精品少妇人欧美激情在线观看| 草草在线视频| 欧美亚洲自拍偷拍| 久久aaaa片一区二区| 欧美日韩另类图片| 色av中文字幕一区| 久久久精品人妻一区二区三区四| 一本色道久久综合亚洲精品不| 国产aⅴ夜夜欢一区二区三区| 在线观看亚洲一区二区| 成人不卡免费av| 视频一区二区三区免费观看| 成人黄色网址| 欧美性猛交xxxx乱大交蜜桃| 小明看看成人免费视频| 久久婷婷国产| 日韩在线观看免费全集电视剧网站| 久久精品www人人爽人人| 久久资源在线| 成人欧美一区二区| 波多野结衣在线影院| 一个色综合网站| 成人性视频欧美一区二区三区| 一区二区三区四区高清视频| 亚洲图中文字幕| 九九九国产视频| 激情综合五月婷婷| 日韩中文不卡| 国内激情视频在线观看| 欧美一区二区三区性视频| a天堂中文字幕| 亚洲激情自拍| 亚洲r级在线观看| 二人午夜免费观看在线视频| 亚洲国产精品久久艾草纯爱| 午夜精品中文字幕| 国内精品久久久久久久影视简单| 高清一区二区三区日本久| 国产精品无码免费播放| 国产日韩v精品一区二区| 欧美日韩在线一| 亚洲一区电影| 欧美床上激情在线观看| 夜夜狠狠擅视频| 国产亚洲视频系列| 欧美极品欧美精品欧美| 精品国产一区二区三区不卡蜜臂| 久久夜色撩人精品| 这里只有精品9| 欧美国产精品一区| 日日碰狠狠躁久久躁婷婷| 国产三级精品三级在线观看国产| 麻豆乱码国产一区二区三区 | 成人两性免费视频| av二区在线| 欧美性生活久久| 一道本在线观看| 久久久亚洲一区| 欧美理论一区二区| 成人亚洲欧美| 亚洲欧美在线播放| 久久99国产综合精品免费| 26uuu国产日韩综合| 红桃av在线播放| 婷婷成人影院| 日本不卡视频在线播放| 日产精品久久久久久久性色| 日韩欧美在线免费观看| 亚洲av无码一区二区二三区| 免费视频一区二区三区在线观看| 久久另类ts人妖一区二区| 天堂中文最新版在线中文| 亚洲男女自偷自拍图片另类| 国内自拍视频在线播放| 国产视频一区在线播放| the porn av| 亚州av乱码久久精品蜜桃| 91香蕉亚洲精品| 国产极品人妖在线观看| 日韩精品在线播放| 丁香社区五月天| 国产精品人人做人人爽人人添| 亚洲综合婷婷久久| 亚洲精品一区二区妖精| 成人av电影免费| 国模冰冰炮一区二区| 在线一区二区日韩| 99在线无码精品入口| 亚洲在线视频网站| 成人h动漫精品一区| 日本三级亚洲精品| 国风产精品一区二区| 欧美日韩一本| 国产精品免费视频xxxx| 国产精品扒开做爽爽爽的视频| 欧美v日韩v国产v| 欧美三级午夜理伦| 国产精品免费网站在线观看| 性生活在线视频| 久久精品导航| 久久观看最新视频| 久久99性xxx老妇胖精品| 国产美女精品视频| 波多野结衣在线播放| 亚洲午夜小视频| 国内精品偷拍视频| 欧美色另类天堂2015| 国产天堂av在线| www.欧美日韩| 在线免费观看av网| 亚洲影院在线| 日本福利视频网站| blacked蜜桃精品一区| 国产精品99久久久久久久 | 国产视频一区三区| 亚洲高清视频一区| 日本久久成人网| 91精品久久久久久久久| 色多多在线观看| 久久亚洲精品毛片| 你懂的在线免费观看| 日韩美女一区二区三区四区| 欧美国产一级片| 亚洲不卡av一区二区三区| 99久久久无码国产精品不卡| 国产精品自拍av| 日韩精品亚洲精品| 性无码专区无码| 亚洲男女一区二区三区| 色无极影院亚洲| 成人深夜在线观看| 999在线精品视频| 麻豆成人在线| 大西瓜av在线| 这里只有精品在线| 日韩av免费电影| 欧美成人午夜77777| 97netav| 中文字幕成人| 国产精品视频不卡| 久久91导航| 欧美一区深夜视频| www.综合| 久久久久久久久久久久av| 成人免费网址| 久久精品视频亚洲| 午夜免费视频在线国产| 一区二区三区视频在线| 激情福利在线| 亚洲欧美日韩视频一区| 亚洲欧美一区二区三| 亚洲第一网站免费视频| 成人爽a毛片一区二区| 日韩视频在线你懂得| 国产哺乳奶水91在线播放| 欧美日韩在线免费视频| 啪啪小视频网站| 色噜噜久久综合| 国产91国语对白在线| 欧美日韩亚洲视频| 日韩美一区二区| 色av成人天堂桃色av| 一级黄色av片| 在线观看视频一区二区 | av网站免费在线观看| 久久精品视频在线观看| 国产午夜精品久久久久免费视| 精品国产一区二区三区在线观看| 久做在线视频免费观看| 美女国内精品自产拍在线播放| 亚洲小说区图片区都市| 欧美日韩第一页| 成人黄色动漫| 日本在线观看天堂男亚洲 | 黄色网在线看| 麻豆国产精品va在线观看不卡 | 天天射综合影视| 日本天堂网在线| 色天使色偷偷av一区二区| 精品国产青草久久久久96| 欧美高清www午色夜在线视频| 国产三区在线播放| 精品国产凹凸成av人导航| 婷婷五月综合激情| 国产亚洲精品久久久久动| 1769在线观看| 另类色图亚洲色图| 999福利在线视频| 日韩av大片免费看| 日本一区二区中文字幕| 成人18视频| 蜜桃一区二区三区| 一区二区精品国产| 亚洲无线一线二线三线区别av| 少妇人妻互换不带套| 久久 天天综合| 一区二区免费在线观看视频| 国产精品网站在线| 国产一级在线播放| 91国偷自产一区二区三区成为亚洲经典| 懂色av蜜臀av粉嫩av喷吹| 日韩欧美一区二区不卡| 邻家有女韩剧在线观看国语| 日韩亚洲欧美中文在线| 国产va在线视频| 国产日韩欧美91| 日韩av三区| 波多野结衣激情| 免费一级欧美片在线播放| 国内av免费观看| 国产欧美一区二区三区网站| 欧美人妻精品一区二区三区| 色94色欧美sute亚洲线路一久| 国产黄色av片| 国产一区二区日韩精品欧美精品| 日韩av官网| 国产欧美精品一区二区三区-老狼| 57pao国产一区二区| 亚洲福利av在线| 国产亚洲精品v| 成人高清在线观看视频| 国产日韩欧美不卡在线| 久久视频免费看| 欧美日韩国产首页| 黄色电影免费在线看| 欧美激情国内偷拍| 成人在线视频www| 欧洲成人一区二区| 国产一区成人| 久久国产免费视频| 中文字幕一区二区在线观看| 日韩免费av网站| 精品小视频在线| 国产理论电影在线| 2022国产精品| 欧美超碰在线| 黄色av免费在线播放| www.欧美日韩国产在线| 国产一级av毛片| 日韩视频一区二区三区在线播放| 91精彩在线视频| 国产成人精品在线观看| 日韩成人一级| 男女超爽视频免费播放| 国产99久久精品| wwwav国产| 91精品国产综合久久久久久久久久| 国产女人在线观看| 日本久久久久久久久久久| 日韩激情毛片| 国产亚洲天堂网| 久久日一线二线三线suv| 国产区一区二区三| 国产视频在线一区二区| 综合日韩av| 欧美精品成人一区二区在线观看| 中文一区在线| 艳妇乳肉亭妇荡乳av| 亚洲成a人在线观看| 精品人妻少妇嫩草av无码专区| 久久九九热免费视频| 亚洲三级在线| 国产树林野战在线播放| 国产在线观看一区二区| caoporn91| 精品女同一区二区| 欧美大片黄色| 好吊色欧美一区二区三区四区 | 手机免费看av网站| 亚洲欧洲精品一区二区精品久久久 | 久久av无码精品人妻系列试探| 亚洲综合一区在线| 色婷婷av一区二区三区之e本道| 孩xxxx性bbbb欧美| 亚洲精品动态| 天堂网在线免费观看| 亚洲欧美激情一区二区| 亚洲精品久久久蜜桃动漫 | 日本成人一区二区| 色哺乳xxxxhd奶水米仓惠香| 丁香网亚洲国际| 国产污污视频在线观看| 国产亚洲精品久久久久动| 亚洲aⅴ网站| 免费在线黄网站| 91美女在线视频| 中文字幕制服诱惑| 麻豆国产va免费精品高清在线| 国产一级成人av| 乱子伦视频在线看| 成人免费视频在线观看| 刘亦菲久久免费一区二区| 日韩av电影国产| 你懂的国产精品| 亚洲第九十七页| 欧美日韩免费观看一区三区| 欧美xxxx视频| 日本一区视频在线观看| 国产在线精品一区二区不卡了| 国产第一页第二页| 中文字幕最新精品| xxxx日韩| 污污网站在线观看视频| 一卡二卡三卡日韩欧美| 触手亚洲一区二区三区| av成人综合网| 日本欧美一区二区三区| 国产第100页| 深夜福利91大全| 久久365资源| 亚洲精品久久久久久宅男| 性感美女极品91精品| 黄色网页在线播放| 欧美精品一区二区三区四区五区| 国产一区二区免费看| 国产精品传媒在线观看| 韩国三级日本三级少妇99|