做网站服务器权限设置WordPress mx 主题

当前位置: 首页 > news >正文

做网站服务器权限设置,WordPress mx 主题,天堂网在线观看,优化法治化营商环境文章目录 策略模式场景示例 迭代器模式场景示例 访问者模式场景示例 观察者模式场景示例 命令模式场景示例 模板方法模式场景示例 模板方法模式场景示例 事件驱动模式场景示例 责任链模式场景示例 中介者模式场景示例 状态模式场景示例 策略模式 策略模式#xff08;Strategy… 文章目录 策略模式场景示例 迭代器模式场景示例 访问者模式场景示例 观察者模式场景示例 命令模式场景示例 模板方法模式场景示例 模板方法模式场景示例 事件驱动模式场景示例 责任链模式场景示例 中介者模式场景示例 状态模式场景示例 策略模式 策略模式Strategy Pattern是一种行为设计模式它定义了一系列算法并将每个算法封装起来使它们可以互相替换。策略模式使得算法可以独立于客户端而变化客户端可以根据需要选择不同的算法。 策略Strategy定义了一个算法族的抽象接口所有具体策略类都实现了这个接口。 具体策略Concrete Strategy实现了策略接口的具体算法。 上下文Context维护一个对策略对象的引用并提供一个接口来设置和切换策略。上下文通过委托给策略对象来执行算法。
场景 行为多样化当一个类有多个行为或算法并且这些行为可以根据不同的需求进行切换时可以使用策略模式。策略模式将每个行为封装成一个策略对象客户端可以根据需要选择和切换不同的策略。 条件语句复杂当一个类中包含大量的条件语句来选择不同的行为时可以使用策略模式来简化代码。策略模式将每个条件语句对应的行为封装成一个策略对象客户端只需要根据需要选择和使用策略而无需关心具体的实现细节。 算法可自由切换当一个类的行为或算法可能需要在运行时动态切换时可以使用策略模式。策略模式允许客户端在不影响原有代码的情况下动态选择和切换不同的策略提高了代码的灵活性和可维护性。 需要对算法进行封装当需要对算法进行封装使其可以独立于客户端而变化时可以使用策略模式。策略模式将算法封装成独立的策略对象客户端只需要关注选择和使用策略的接口而无需关心具体的算法实现细节。 排序算法当需要对一组数据进行排序时可以根据不同的需求选择不同的排序算法如快速排序、冒泡排序、插入排序等。 数据校验当需要对用户输入的数据进行校验时可以根据不同的校验规则选择不同的校验算法如邮箱校验、手机号校验、密码强度校验等。 商业规则引擎当需要根据不同的商业规则对业务逻辑进行处理时可以根据不同的规则选择不同的处理策略如折扣策略、促销策略、会员等级策略等。
示例

定义策略接口

class PaymentStrategy:def pay(self, amount):pass# 具体策略类支付宝支付 class AliPayStrategy(PaymentStrategy):def pay(self, amount):print(f支付宝支付{amount})# 具体策略类微信支付 class WeChatPayStrategy(PaymentStrategy):def pay(self, amount):print(f微信支付{amount})# 具体策略类银行卡支付 class CardPayStrategy(PaymentStrategy):def pay(self, amount):print(f银行卡支付{amount})# 上下文类 class PaymentContext:def init(self, payment_strategy):self._payment_strategy payment_strategydef set_payment_strategy(self, payment_strategy):self._payment_strategy payment_strategydef pay(self, amount):self._payment_strategy.pay(amount)# 客户端代码 def main():# 创建支付上下文对象payment_context PaymentContext(AliPayStrategy())# 进行支付payment_context.pay(100)# 切换支付策略为微信支付payment_context.set_payment_strategy(WeChatPayStrategy())payment_context.pay(200)# 切换支付策略为银行卡支付payment_context.set_payment_strategy(CardPayStrategy())payment_context.pay(300)if name main:main()输出结果 支付宝支付100 微信支付200 银行卡支付300迭代器模式 迭代器模式Iterator Pattern是一种行为设计模式它用于提供一种方法来顺序访问聚合对象中的元素而不需要暴露聚合对象的内部表示。迭代器模式将迭代逻辑封装在一个单独的迭代器对象中使得客户端可以通过统一的接口来遍历聚合对象而无需了解其内部结构。 迭代器Iterator定义了访问和遍历聚合对象元素的接口包括 iter 方法和 next 方法。 具体迭代器Concrete Iterator实现了迭代器接口负责管理遍历聚合对象中的元素。 聚合对象Aggregate定义了一个接口来创建相应的迭代器对象。 具体聚合对象Concrete Aggregate实现了聚合对象接口负责创建具体的迭代器对象并提供了一个方法来获取迭代器。
场景 遍历集合对象当需要遍历聚合对象中的元素时并且希望遍历逻辑可以独立于聚合对象和客户端而变化时可以使用迭代器模式。迭代器模式将遍历逻辑封装在一个迭代器对象中使得客户端可以通过统一的接口来遍历不同类型的聚合对象。 隐藏聚合对象内部结构当希望隐藏聚合对象的内部结构并且通过迭代器来访问聚合对象中的元素时可以使用迭代器模式。迭代器模式将遍历逻辑和聚合对象的内部结构解耦使得客户端不需要了解聚合对象的具体实现细节。 支持多种遍历方式当需要支持多种遍历方式并且希望遍历逻辑可以独立变化时可以使用迭代器模式。迭代器模式可以定义多个不同的迭代器对象每个迭代器对象负责不同的遍历方式客户端可以根据需要选择合适的迭代器对象来遍历聚合对象。 简化客户端代码当希望简化客户端代码并且使客户端不需要了解聚合对象的具体实现细节时可以使用迭代器模式。迭代器模式将遍历逻辑封装在迭代器对象中客户端只需要通过统一的接口来遍历聚合对象简化了客户端代码。 集合类的迭代器迭代器模式常用于集合类中如列表、字典、集合等。通过迭代器模式可以在不暴露集合类内部结构的情况下遍历集合中的元素。 文件流的迭代器迭代器模式可以用于文件流中如文本文件、日志文件等。通过迭代器模式可以逐行读取文件内容而不需要一次性加载整个文件到内存中。 数据库查询结果的迭代器迭代器模式可以用于数据库查询结果中如查询结果集合中的行数据。通过迭代器模式可以逐行遍历查询结果集合中的数据而不需要一次性加载整个结果集合到内存中。
示例

定义迭代器接口

class Iterator:def iter(self):passdef next(self):pass# 具体迭代器类顺序迭代器 class SequentialIterator(Iterator):def init(self, collection):self._collection collectionself._index 0def iter(self):return selfdef next(self):if self._index len(self._collection):item self._collection[self._index]self._index 1return itemelse:raise StopIteration# 客户端代码 def main():collection [1, 2, 3, 4, 5]# 创建顺序迭代器iterator SequentialIterator(collection)# 使用迭代器遍历集合for item in iterator:print(item)if name main:main()输出结果 1 2 3 4 5访问者模式 访问者模式Visitor Pattern是一种行为设计模式它用于在不改变元素类的前提下定义对元素类中的各个元素进行操作的新操作。访问者模式通过在元素类中添加一个接受访问者对象的方法并在访问者对象中定义对元素类中各个元素进行操作的方法使得可以在不改变元素类的情况下添加新的操作。 访问者Visitor定义了对元素类中各个元素进行操作的方法。访问者模式中通常会定义一个访问者接口包含对各种类型的元素进行操作的方法。 具体访问者Concrete Visitor实现了访问者接口负责实现对元素类中各个元素进行具体操作的方法。 元素Element定义了接受访问者对象的方法并将自身传递给访问者对象。元素类中通常会包含一个接受访问者对象的方法用于将自身传递给访问者对象。 具体元素Concrete Element实现了元素接口负责实现接受访问者对象的方法并将自身传递给访问者对象。具体元素类中通常会包含一个接受访问者对象的方法并在方法中调用访问者对象的对应方法。 对象结构Object Structure包含一个元素的集合并提供一个接受访问者对象的方法。对象结构类中通常会包含一个集合对象并提供一个接受访问者对象的方法用于将访问者对象应用到集合中的每个元素上。
场景 对象结构稳定但操作频繁变化当对象结构相对稳定但需要对其进行各种不同的操作时可以使用访问者模式。访问者模式将操作封装在访问者对象中使得可以在不改变元素类的情况下定义新的操作从而适应操作频繁变化的需求。 数据结构与数据操作分离当数据结构与对数据的操作分离且操作需要根据不同的数据结构而变化时可以使用访问者模式。访问者模式将操作封装在访问者对象中使得可以在不同的数据结构上应用相同的访问者对象从而实现操作的复用。 执行复杂的操作当需要对一个复杂对象结构中的各个元素进行不同的、复杂的操作时可以使用访问者模式。访问者模式将操作封装在访问者对象中使得可以对复杂的操作进行拆分和组合提高了代码的可维护性和可扩展性。 添加新操作频繁当需要添加新的操作时但不希望修改元素类的情况下可以使用访问者模式。访问者模式通过在访问者对象中定义新的操作方法使得可以在不改变元素类的情况下新增操作提高了系统的灵活性和可扩展性。
示例 from abc import ABC, abstractmethod# 抽象元素元素 class Element(ABC):abstractmethoddef accept(self, visitor):pass# 具体元素圆形 class Circle(Element):def accept(self, visitor):visitor.visit_circle(self)# 具体元素矩形 class Rectangle(Element):def accept(self, visitor):visitor.visit_rectangle(self)# 抽象访问者访问者 class Visitor(ABC):abstractmethoddef visit_circle(self, circle):passabstractmethoddef visit_rectangle(self, rectangle):pass# 具体访问者面积计算器 class AreaCalculator(Visitor):def visit_circle(self, circle):print(计算圆形的面积)def visit_rectangle(self, rectangle):print(计算矩形的面积)# 客户端代码 def main():# 创建元素对象circle Circle()rectangle Rectangle()# 创建访问者对象并使用访问者访问元素area_calculator AreaCalculator()circle.accept(area_calculator)rectangle.accept(area_calculator)if name main:main()输出结果 计算圆形的面积 计算矩形的面积观察者模式 观察者模式Observer Pattern是一种行为设计模式用于定义对象之间的一种一对多的依赖关系使得当一个对象的状态发生变化时所有依赖于它的对象都会得到通知并自动更新。 在观察者模式中主题Subject维护一个观察者Observer列表每当主题的状态发生变化时它会遍历观察者列表并通知每个观察者使得观察者可以自动更新。观察者模式将主题和观察者解耦使得主题和观察者可以独立变化提高了代码的灵活性和可维护性。 主题Subject维护一个观察者列表并提供方法来添加、删除和通知观察者。 具体主题Concrete Subject实现了主题接口负责维护一个观察者列表并在状态发生变化时通知观察者。 观察者Observer定义了一个更新接口用于接收主题的通知并进行相应的更新。 具体观察者Concrete Observer实现了观察者接口负责在接收到主题通知时进行相应的更新操作。
场景 GUI 应用程序中的事件处理在图形用户界面GUI应用程序中用户操作如点击按钮、输入文本等可以作为主题而界面元素如按钮、文本框等可以作为观察者。当用户操作发生时主题会通知所有观察者并更新界面。 消息通知系统在消息通知系统中消息发布者可以作为主题而订阅者可以作为观察者。当有新消息发布时主题会通知所有订阅者并发送消息。 股票市场监控系统在股票市场监控系统中股票价格变化可以作为主题而投资者可以作为观察者。当股票价格发生变化时主题会通知所有投资者并更新股票价格。 事件驱动的系统在事件驱动的系统中事件源可以作为主题而事件监听器可以作为观察者。当事件发生时主题会通知所有观察者并执行相应的事件处理逻辑。 发布-订阅模型在发布-订阅模型中发布者可以作为主题而订阅者可以作为观察者。当有新的消息或事件发布时主题会通知所有订阅者并执行相应的处理逻辑。
示例 from abc import ABC, abstractmethod# 抽象主题主题 class Subject(ABC):abstractmethoddef attach(self, observer):passabstractmethoddef detach(self, observer):passabstractmethoddef notify(self):pass# 具体主题天气 class Weather(Subject):def init(self):self.observers []self.temperature 0self.humidity 0def 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(self.temperature, self.humidity)def set_weather(self, temperature, humidity):self.temperature temperatureself.humidity humidityself.notify()# 抽象观察者观察者 class Observer(ABC):abstractmethoddef update(self, temperature, humidity):pass# 具体观察者手机 class Phone(Observer):def update(self, temperature, humidity):print(手机收到天气通知温度 {} 度湿度 {}%.format(temperature, humidity))# 具体观察者电视 class Television(Observer):def update(self, temperature, humidity):print(电视收到天气通知当前天气情况温度 {} 度湿度 {}%.format(temperature, humidity))# 客户端代码 def main():# 创建天气主题对象weather Weather()# 创建手机和电视观察者对象并注册到天气主题phone Phone()television Television()weather.attach(phone)weather.attach(television)# 设置天气情况并通知观察者weather.set_weather(28, 60)if name main:main()输出结果 手机收到天气通知温度 28 度湿度 60% 电视收到天气通知当前天气情况温度 28 度湿度 60%命令模式 命令模式Command Pattern是一种行为设计模式它将请求封装成一个对象从而允许使用不同的请求、队列或者日志请求来参数化其他对象并且支持可撤销操作。 在命令模式中客户端发送请求的对象称为调用者Invoker而接收和执行请求的对象称为接收者Receiver。命令模式将请求封装成一个命令对象Command并定义了一个统一的执行方法使得调用者不需要知道请求的具体接收者只需要知道如何执行命令。 命令Command定义了执行操作的接口包含一个执行方法 execute用于执行具体的操作。 具体命令Concrete Command实现了命令接口负责将请求绑定到接收者并执行具体的操作。 接收者Receiver负责执行命令指定的操作。 调用者Invoker负责发送请求并执行命令。 客户端Client创建具体命令对象并将其绑定到调用者然后通过调用者来发送请求。
场景 GUI 应用程序的菜单和工具栏在图形用户界面GUI应用程序中菜单和工具栏上的操作可以被封装成命令对象当用户点击菜单或工具栏按钮时相应的命令对象被执行从而实现与接收者的解耦和可撤销操作。 多级撤销和重做命令模式可以用于实现多级撤销和重做功能。每个命令对象都记录了执行操作和撤销操作的方法通过将命令对象保存在历史记录中可以轻松地支持多级撤销和重做。 数据库事务管理在数据库系统中事务操作可以被封装成命令对象。当事务提交时命令对象被执行当事务回滚时命令对象被撤销。通过使用命令模式可以实现数据库操作和事务管理的解耦。 网络请求处理在网络应用程序中网络请求可以被封装成命令对象。当网络请求到达时相应的命令对象被创建并执行从而实现与网络请求处理逻辑的解耦和可扩展性。 日程安排和任务调度在日程安排和任务调度系统中日程和任务可以被封装成命令对象。当日程或任务开始时相应的命令对象被执行从而实现与日程安排和任务调度逻辑的解耦和可撤销操作。
示例 from abc import ABC, abstractmethod# 命令接口 class Command(ABC):abstractmethoddef execute(self):pass# 具体命令开灯 class TurnOnCommand(Command):def init(self, light):self.light lightdef execute(self):self.light.turn_on()# 具体命令关灯 class TurnOffCommand(Command):def init(self, light):self.light lightdef execute(self):self.light.turn_off()# 接收者电灯 class Light:def turn_on(self):print(灯打开了)def turn_off(self):print(灯关闭了)# 调用者遥控器 class RemoteControl:def init(self):self.command Nonedef set_command(self, command):self.command commanddef press_button(self):if self.command:self.command.execute()# 客户端代码 def main():# 创建电灯对象light Light()# 创建具体命令对象并将其绑定到接收者turn_on_command TurnOnCommand(light)turn_off_command TurnOffCommand(light)# 创建调用者对象并设置命令remote_control RemoteControl()remote_control.set_command(turn_on_command)# 模拟按下按钮remote_control.press_button()# 设置另一个命令并再次按下按钮remote_control.set_command(turn_off_command)remote_control.press_button()if name main:main()输出结果 灯打开了 灯关闭了模板方法模式 模板方法模式Template Method Pattern是一种行为设计模式它定义了一个操作中的算法框架将某些步骤延迟到子类中实现。这样可以在不改变算法结构的情况下重新定义算法中的某些步骤从而实现代码重用和灵活性的增加。 模板方法模式的核心思想是定义一个抽象类其中包含一个模板方法该方法定义了算法的骨架包括一系列的步骤而这些步骤可以是具体实现或者是抽象方法。具体的子类可以通过实现这些抽象方法来提供算法中的具体步骤从而定制化算法的行为。 抽象类Abstract Class定义了一个模板方法其中包含算法的骨架和一系列的步骤这些步骤可以是具体的实现或者是抽象方法由子类来实现。 具体类Concrete Class继承自抽象类并实现了抽象方法提供了算法中的具体步骤的实现。
场景 框架设计在框架设计中通常会定义一个抽象类作为框架的核心其中包含了一些公共的方法和模板方法而具体的子类则通过实现模板方法来定制化框架的行为。这样可以保持框架的一致性和稳定性同时又能够灵活地定制化框架的行为。 算法设计在算法设计中通常会定义一个抽象类作为算法的模板其中包含了算法的骨架和一些公共的步骤而具体的子类则通过实现抽象方法来提供算法中的具体步骤。这样可以保持算法的一致性和可扩展性同时又能够灵活地定制化算法的行为。 代码生成工具在代码生成工具中通常会定义一个抽象类作为代码生成器的模板其中包含了一些公共的方法和模板方法而具体的子类则通过实现模板方法来生成不同语言或者不同框架的代码。这样可以实现代码的自动生成并且保持代码的一致性和可扩展性。 流程控制在流程控制中通常会定义一个抽象类作为流程的模板其中包含了流程的骨架和一些公共的步骤而具体的子类则通过实现抽象方法来提供流程中的具体步骤。这样可以保持流程的一致性和可扩展性同时又能够灵活地定制化流程的行为。
示例 from abc import ABC, abstractmethod# 抽象类饮料 class Beverage(ABC):# 模板方法定义了饮料的制作流程def prepare_beverage(self):self.boil_water()self.brew()self.pour_in_cup()self.add_condiments()# 具体步骤煮水def boil_water(self):print(煮水)# 具体步骤冲泡abstractmethoddef brew(self):pass# 具体步骤倒入杯中def pour_in_cup(self):print(倒入杯中)# 具体步骤加入调料abstractmethoddef add_condiments(self):pass# 具体类咖啡 class Coffee(Beverage):# 实现冲泡方法def brew(self):print(用滤网滴取咖啡)# 实现加入调料方法def add_condiments(self):print(加入糖和牛奶)# 具体类茶 class Tea(Beverage):# 实现冲泡方法def brew(self):print(泡茶)# 实现加入调料方法def add_condiments(self):print(加入柠檬)# 客户端代码 def main():print(制作咖啡:)coffee Coffee()coffee.prepare_beverage()print(\n制作茶:)tea Tea()tea.prepare_beverage()if name main:main()输出结果 制作咖啡: 煮水 用滤网滴取咖啡 倒入杯中 加入糖和牛奶制作茶: 煮水 泡茶 倒入杯中 加入柠檬模板方法模式 模板方法模式Template Method Pattern是一种行为设计模式它定义了一个操作中的算法骨架而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下重新定义算法中的某些步骤。 在模板方法模式中通常会有一个抽象类该抽象类包含一个模板方法模板方法定义了算法的骨架包括一系列的步骤。其中一些步骤可能是具体的实现而另一些步骤则可以是抽象的由子类来实现。子类通过扩展或重写这些抽象方法来提供算法中的具体步骤从而定制化算法的行为。 抽象类Abstract Class定义了一个模板方法该方法包含算法的骨架和一系列的步骤其中一些步骤可以是具体的实现而另一些步骤则可以是抽象的由子类来实现。 具体类Concrete Class继承自抽象类并实现了抽象方法提供了算法中的具体步骤的实现。
场景 定义算法框架当需要定义一个算法的骨架并且其中一些步骤可以具体实现而另一些步骤需要延迟到子类中实现时可以使用模板方法模式。这样可以确保算法的一致性和稳定性同时又能够灵活地定制化算法的行为。 代码重用当有多个类中存在类似的算法并且这些算法的结构类似但具体步骤有所不同时可以将公共部分抽象成模板方法避免重复代码的产生提高代码的重用性。 框架设计在框架设计中通常会定义一个抽象类作为框架的核心其中包含了一些公共的方法和模板方法而具体的子类则通过实现模板方法来定制化框架的行为。这样可以保持框架的一致性和稳定性同时又能够灵活地定制化框架的行为。 流程控制当有一系列步骤需要按照一定的顺序执行并且其中某些步骤需要定制化时可以使用模板方法模式。这样可以保持流程的一致性和稳定性同时又能够灵活地定制化流程的行为。
示例 from abc import ABC, abstractmethod# 抽象类制作食物 class Food(ABC):# 模板方法定义了食物的制作流程def prepare_food(self):self.prepare_ingredients()self.cook()self.serve()# 具体步骤准备食材def prepare_ingredients(self):print(准备食材)# 具体步骤烹饪abstractmethoddef cook(self):pass# 具体步骤上菜def serve(self):print(上菜)# 具体类炒菜 class StirFry(Food):# 实现烹饪方法def cook(self):print(炒菜)# 具体类煮汤 class BoilSoup(Food):# 实现烹饪方法def cook(self):print(煮汤)# 客户端代码 def main():print(制作炒菜:)stir_fry StirFry()stir_fry.prepare_food()print(\n制作煮汤:)boil_soup BoilSoup()boil_soup.prepare_food()if name main:main()输出结果 制作炒菜: 准备食材 炒菜 上菜制作煮汤: 准备食材 煮汤 上菜事件驱动模式 事件驱动模式Event-driven architecture是一种软件设计范式其中系统的行为是由事件的发生和相应的处理来驱动的。在事件驱动模式中系统中的组件通过发布和订阅事件的方式进行通信当特定的事件发生时相关的处理器会被调用来处理该事件。 事件Event系统中的行为或状态变化。事件可以是内部的状态变化也可以是外部的触发动作比如用户输入、网络消息等。 事件源Event Source产生事件的组件或对象。事件源可以是用户界面、传感器、网络等。 事件处理器Event Handler用于处理特定类型事件的组件或函数。当事件发生时相应的事件处理器会被调用来处理事件。 事件监听器Event Listener监听并处理特定类型事件的组件或函数。事件监听器通常会订阅感兴趣的事件当事件发生时会调用相应的事件处理器来处理事件。
场景 图形用户界面GUI图形界面中的用户操作如鼠标点击、键盘输入都可以看作是事件GUI 库通常会提供事件监听器和处理器用于处理这些事件从而实现交互式界面。 网络编程在网络编程中事件驱动模式常用于处理网络消息和连接状态变化。例如在异步网络框架中可以注册事件监听器来处理接收到的网络消息和连接的建立或关闭事件。 服务器端开发服务器端开发中经常需要处理大量的并发请求事件驱动模式可以帮助实现高效的并发处理。例如在 Web 服务器中可以使用事件驱动模式来处理 HTTP 请求和响应。 游戏开发游戏开发中的用户操作、碰撞检测、动画效果等都可以看作是事件游戏引擎通常会提供事件系统来处理这些事件从而实现游戏逻辑。 消息队列系统消息队列系统通常使用事件驱动模式来处理消息的生产和消费。消息生产者将消息发送到队列中消息消费者注册事件监听器来处理队列中的消息。 分布式系统在分布式系统中节点之间的通信和数据传输都可以看作是事件事件驱动模式可以帮助实现分布式系统中的消息传递和事件处理。
示例 from abc import ABC, abstractmethod# 抽象事件源 class EventSource(ABC):def init(self):self.listeners []def add_listener(self, listener):self.listeners.append(listener)def remove_listener(self, listener):self.listeners.remove(listener)abstractmethoddef notify_listeners(self, event):pass# 具体事件源按钮 class Button(EventSource):def click(self):print(按钮被点击了)self.notify_listeners(click)def notify_listeners(self, event):for listener in self.listeners:listener.handle_event(event)# 抽象事件监听器 class EventListener(ABC):abstractmethoddef handle_event(self, event):pass# 具体事件监听器日志记录器 class Logger(EventListener):def handle_event(self, event):print(日志记录器记录事件{}.format(event))# 具体事件监听器邮件通知器 class EmailNotifier(EventListener):def handle_event(self, event):print(邮件通知器发送邮件事件{}.format(event))# 客户端代码 def main():button Button()logger Logger()email_notifier EmailNotifier()button.add_listener(logger)button.add_listener(email_notifier)# 模拟按钮点击事件button.click()if name main:main()输出结果 按钮被点击了 日志记录器记录事件click 邮件通知器发送邮件事件click责任链模式 责任链模式Chain of Responsibility Pattern是一种行为设计模式它允许多个对象都有机会处理请求从而避免请求的发送者和接收者之间的耦合关系。在责任链模式中请求沿着一条链传递直到有一个对象处理请求为止。 Handler处理者定义了一个处理请求的接口并维护了一个指向下一个处理者的引用。处理者通常包含一个处理请求的方法用于处理请求或将请求传递给下一个处理者。 ConcreteHandler具体处理者实现了处理请求的具体逻辑并在必要时将请求传递给下一个处理者。每个具体处理者都负责处理一种或多种类型的请求。 Client客户端创建一个责任链并向链中的第一个处理者发送请求。客户端通常不知道链中的具体处理者是谁只需要将请求发送给责任链的第一个处理者即可。
场景 请求处理链当有多个对象都有机会处理同一个请求时可以使用责任链模式。例如一个网络服务器可以有多个中间件组成的处理链来处理请求每个中间件负责处理特定类型的请求或执行特定的处理逻辑。 日志记录在日志记录系统中可以使用责任链模式来实现不同级别日志的记录。例如一个日志记录器链可以包含多个具体日志记录器每个日志记录器负责记录特定级别的日志。 权限管理在权限管理系统中可以使用责任链模式来实现权限检查的处理链。例如一个权限检查器链可以包含多个具体权限检查器每个权限检查器负责检查特定权限是否被授权。 事件处理在事件驱动系统中可以使用责任链模式来处理事件的传递和处理。例如一个事件处理器链可以包含多个具体事件处理器每个事件处理器负责处理特定类型的事件。 异常处理在异常处理系统中可以使用责任链模式来处理异常的传递和处理。例如一个异常处理器链可以包含多个具体异常处理器每个异常处理器负责处理特定类型的异常。
示例 from abc import ABC, abstractmethod# 抽象处理者 class Handler(ABC):def init(self, successorNone):self.successor successorabstractmethoddef handle_request(self, request):pass# 具体处理者A class ConcreteHandlerA(Handler):def handle_request(self, request):if request A:print(ConcreteHandlerA处理请求{}.format(request))elif self.successor:self.successor.handle_request(request)# 具体处理者B class ConcreteHandlerB(Handler):def handle_request(self, request):if request B:print(ConcreteHandlerB处理请求{}.format(request))elif self.successor:self.successor.handle_request(request)# 具体处理者C class ConcreteHandlerC(Handler):def handle_request(self, request):if request C:print(ConcreteHandlerC处理请求{}.format(request))elif self.successor:self.successor.handle_request(request)# 客户端代码 def main():handler_a ConcreteHandlerA()handler_b ConcreteHandlerB()handler_c ConcreteHandlerC()handler_a.successor handler_bhandler_b.successor handler_c# 构建处理链传递请求handler_a.handle_request(A)handler_a.handle_request(B)handler_a.handle_request©handler_a.handle_request(D)if name main:main()输出结果 ConcreteHandlerA处理请求A ConcreteHandlerB处理请求B ConcreteHandlerC处理请求C中介者模式 中介者模式Mediator Pattern是一种行为设计模式它通过引入一个中介者对象来封装一系列对象之间的交互。中介者模式可以降低对象之间的直接耦合使得对象之间的通信更加松散和灵活。 在中介者模式中通常会有一个中介者对象该对象负责协调和管理其他对象之间的交互。当一个对象需要与其他对象进行通信时它不会直接与其他对象进行交互而是通过中介者对象来进行间接通信。这样一来对象之间的耦合度就会降低同时也更容易扩展和维护系统。 中介者Mediator定义了一个接口用于与其他对象进行通信并维护了一个对各个对象的引用。中介者对象通常负责协调和管理对象之间的交互。 具体中介者Concrete Mediator实现了中介者接口并负责协调和管理具体的对象之间的交互。具体中介者通常包含了对各个对象的引用以便于进行通信和协调。 同事对象Colleague定义了一个接口用于与中介者进行通信并维护了一个对中介者的引用。同事对象通常会将自己的状态和行为委托给中介者对象来处理。 具体同事对象Concrete Colleague实现了同事对象接口并负责实现自己的状态和行为。具体同事对象通常会将自己的状态和行为委托给中介者对象来处理。
场景 图形用户界面GUI在图形用户界面中各种组件之间的交互比较复杂例如按钮、文本框、下拉框等组件之间的交互。中介者模式可以将这些组件之间的交互逻辑集中到一个中介者对象中从而降低了组件之间的耦合度。 聊天室在聊天室中用户之间可以发送消息进行交流而用户之间的消息需要通过服务器进行中转。中介者模式可以将聊天室中用户之间的消息交流集中到一个中介者对象中从而简化了用户之间的交流过程。 交通管理系统在交通管理系统中各种交通工具之间需要进行交通管制例如汽车、公交车、地铁等交通工具之间的交通管制。中介者模式可以将这些交通工具之间的交通管制集中到一个中介者对象中从而降低了交通工具之间的耦合度。 游戏开发在游戏开发中各种游戏对象之间需要进行交互例如玩家、敌人、道具等游戏对象之间的交互。中介者模式可以将这些游戏对象之间的交互集中到一个中介者对象中从而简化了游戏对象之间的交互逻辑。 分布式系统在分布式系统中各个节点之间需要进行消息传递和数据交换。中介者模式可以将这些节点之间的消息传递和数据交换集中到一个中介者对象中从而简化了节点之间的通信逻辑。
示例 from abc import ABC, abstractmethod# 抽象中介者 class Mediator(ABC):abstractmethoddef send(self, message, colleague):pass# 具体中介者 class ConcreteMediator(Mediator):def init(self):self.colleague1 Noneself.colleague2 Nonedef set_colleague1(self, colleague):self.colleague1 colleaguedef set_colleague2(self, colleague):self.colleague2 colleaguedef send(self, message, colleague):if colleague self.colleague1:self.colleague2.receive(message)else:self.colleague1.receive(message)# 抽象同事类 class Colleague(ABC):def init(self, mediator):self.mediator mediatorabstractmethoddef send(self, message):passabstractmethoddef receive(self, message):pass# 具体同事类1 class ConcreteColleague1(Colleague):def send(self, message):print(同事1发送消息: {}.format(message))self.mediator.send(message, self)def receive(self, message):print(同事1接收消息: {}.format(message))# 具体同事类2 class ConcreteColleague2(Colleague):def send(self, message):print(同事2发送消息: {}.format(message))self.mediator.send(message, self)def receive(self, message):print(同事2接收消息: {}.format(message))# 客户端代码 def main():mediator ConcreteMediator()colleague1 ConcreteColleague1(mediator)colleague2 ConcreteColleague2(mediator)mediator.set_colleague1(colleague1)mediator.set_colleague2(colleague2)colleague1.send(你好同事2我是同事1。)colleague2.send(你好同事1我是同事2。)if name main:main()输出结果 同事1发送消息: 你好同事2我是同事1。 同事2接收消息: 你好同事2我是同事1。 同事2发送消息: 你好同事1我是同事2。 同事1接收消息: 你好同事1我是同事2。状态模式 状态模式State Pattern是一种行为设计模式它允许对象在内部状态发生改变时改变其行为。状态模式通过将对象的状态封装成独立的状态类并将对象的行为委托给当前状态类来实现状态的切换和行为的变化。 在状态模式中通常会有一个环境类Context该类维护了一个当前状态对象并提供了一个接口来允许客户端代码改变状态。每个具体状态类Concrete State表示了环境对象的一种具体状态并实现了在该状态下的行为。环境类在接收到状态改变的请求时会将请求委托给当前状态对象来处理。 状态模式的核心思想是将对象的状态和行为分离使得状态可以独立于对象而变化。这样一来当对象的状态发生改变时只需要改变当前状态对象而不需要修改对象的行为或者其他状态对象。这样就提高了系统的灵活性和可扩展性并且遵循了开闭原则。 环境类Context维护一个当前状态对象并提供了一个接口来允许客户端代码改变状态。 抽象状态类State定义了一个接口用于封装环境对象的一种具体状态并声明了在该状态下的各种行为。 具体状态类Concrete State实现了抽象状态类定义的接口并实现了在该状态下的具体行为。
场景 对象具有多种状态当对象具有多种状态并且状态之间的转换会导致对象行为发生改变时可以考虑使用状态模式。例如订单在待支付、已支付、已发货、已完成等多种状态之间切换每种状态对应着不同的行为。 条件语句复杂当对象的行为由多个条件语句组成且条件之间存在交互和重叠时可以考虑使用状态模式来简化条件语句。状态模式将每个状态封装成一个独立的对象使得对象的行为在不同状态下的处理变得清晰和简单。 状态转换频繁当对象的状态转换频繁并且状态之间的转换规则较为复杂时可以考虑使用状态模式。状态模式将状态转换的逻辑封装到状态类中使得状态之间的转换更加灵活和易于维护。 行为和状态之间的依赖关系当对象的行为和状态之间存在一对多的依赖关系时可以考虑使用状态模式。状态模式可以将行为和状态解耦使得对象的行为更加灵活和可扩展。
示例 from abc import ABC, abstractmethod# 抽象状态类 class State(ABC):abstractmethoddef handle(self):pass# 具体状态类开机状态 class PowerOnState(State):def handle(self):print(已开机欢迎使用)# 具体状态类关机状态 class PowerOffState(State):def handle(self):print(已关机再见)# 环境类 class Computer:def init(self):self.state Nonedef set_state(self, state):self.state statedef power_on(self):self.set_state(PowerOnState())self.state.handle()def power_off(self):self.set_state(PowerOffState())self.state.handle()# 客户端代码 def main():computer Computer()computer.power_on()computer.power_off()if name main:main()输出结果 已开机欢迎使用 已关机再见