当前位置:首页 > 科技  > 软件

Python 实现命令模式、中介者模式和解释器模式

来源: 责编: 时间:2024-06-05 17:40:25 305观看
导读今天介绍三种行为型设计模式:命令模式、中介者模式和解释器模式。1.命令模式它将请求封装成一个对象,从而使得可以用不同的请求对客户进行参数化。命令模式也支持撤销操作。(1) 命令模式的结构命令模式的核心是命令对象

今天介绍三种行为型设计模式:命令模式、中介者模式和解释器模式。LYu28资讯网——每日最新资讯28at.com

LYu28资讯网——每日最新资讯28at.com

1.命令模式

它将请求封装成一个对象,从而使得可以用不同的请求对客户进行参数化。命令模式也支持撤销操作。LYu28资讯网——每日最新资讯28at.com

(1) 命令模式的结构LYu28资讯网——每日最新资讯28at.com

命令模式的核心是命令对象和接收者对象之间的关系。命令对象封装了一个特定的请求,包含了执行该请求的方法。接收者对象负责实际执行请求。LYu28资讯网——每日最新资讯28at.com

以下是命令模式的基本结构:LYu28资讯网——每日最新资讯28at.com

# 命令对象接口class Command:    def execute(self):        pass    def undo(self):        pass# 具体命令对象类class ConcreteCommandA(Command):    def __init__(self, receiver):        self.receiver = receiver    def execute(self):        self.receiver.action_a()    def undo(self):        self.receiver.undo_action_a()class ConcreteCommandB(Command):    def __init__(self, receiver):        self.receiver = receiver    def execute(self):        self.receiver.action_b()    def undo(self):        self.receiver.undo_action_b()# 接收者对象类class Receiver:    def action_a(self):        print("接收者执行动作A")    def action_b(self):        print("接收者执行动作B")    def undo_action_a(self):        print("接收者撤销动作A")    def undo_action_b(self):        print("接收者撤销动作B")# 客户端代码if __name__ == "__main__":    receiver = Receiver()    command_a = ConcreteCommandA(receiver)    command_b = ConcreteCommandB(receiver)    invoker = Invoker()    invoker.set_command(command_a)    invoker.execute_command()    invoker.set_command(command_b)    invoker.execute_command()

(2) 命令模式的应用场景LYu28资讯网——每日最新资讯28at.com

命令模式适用于以下场景:LYu28资讯网——每日最新资讯28at.com

  • 需要将请求的发送者和接收者解耦,使得它们可以独立地变化。
  • 需要支持撤销操作。

(3) 命令模式的优点LYu28资讯网——每日最新资讯28at.com

  • 命令模式将请求的发送者和接收者解耦,使得它们可以独立地变化。
  • 命令模式支持撤销操作。
  • 命令模式遵循开闭原则,新的命令对象可以很容易地添加到系统中,而不会影响到原有的代码。

(4) 命令模式的缺点LYu28资讯网——每日最新资讯28at.com

  • 命令模式中,命令对象和接收者对象之间存在循环依赖的关系,可能会导致循环引用的问题。

2.中介者模式

它通过封装一系列对象之间的交互,将对象之间的耦合度降低到最低。中介者模式将对象之间的交互转移给中介者对象,从而使得对象之间不再直接相互引用。LYu28资讯网——每日最新资讯28at.com

(1) 中介者模式的结构LYu28资讯网——每日最新资讯28at.com

中介者模式的核心是中介者对象,它封装了一系列对象之间的交互逻辑。中介者对象通常包含一个或多个接口,用于与其他对象进行通信。LYu28资讯网——每日最新资讯28at.com

以下是中介者模式的基本结构:LYu28资讯网——每日最新资讯28at.com

# 中介者接口class Mediator:    def send(self, message, colleague):        pass# 同事类接口class Colleague:    def set_mediator(self, mediator):        pass    def send(self, message):        pass    def receive(self, message):        pass# 具体中介者类class ConcreteMediator(Mediator):    def __init__(self):        self.colleague_a = None        self.colleague_b = None    def set_colleague_a(self, colleague_a):        self.colleague_a = colleague_a    def set_colleague_b(self, colleague_b):        self.colleague_b = colleague_b    def send(self, message, colleague):        if colleague == self.colleague_a:            self.colleague_b.receive(message)        elif colleague == self.colleague_b:            self.colleague_a.receive(message)# 具体同事类class ConcreteColleagueA(Colleague):    def __init__(self, mediator):        self.mediator = mediator    def set_mediator(self, mediator):        self.mediator = mediator    def send(self, message):        self.mediator.send(message, self)    def receive(self, message):        print("同事A收到消息:", message)class ConcreteColleagueB(Colleague):    def __init__(self, mediator):        self.mediator = mediator    def set_mediator(self, mediator):        self.mediator = mediator    def send(self, message):        self.mediator.send(message, self)    def receive(self, message):        print("同事B收到消息:", message)# 客户端代码if __name__ == "__main__":    mediator = ConcreteMediator()    colleague_a = ConcreteColleagueA(mediator)    colleague_b = ConcreteColleagueB(mediator)    mediator.set_colleague_a(colleague_a)    mediator.set_colleague_b(colleague_b)    colleague_a.send("Hello, colleague B!")    colleague_b.send("Hi, colleague A!")

(2) 中介者模式的应用场景LYu28资讯网——每日最新资讯28at.com

中介者模式适用于以下场景:LYu28资讯网——每日最新资讯28at.com

  • 一组对象之间存在复杂的交互关系,导致对象之间的耦合度较高。
  • 要求对象之间的交互逻辑可以灵活地改变,而不需要修改对象之间的引用关系。

(3) 中介者模式的优点LYu28资讯网——每日最新资讯28at.com

  • 中介者模式将对象之间的交互逻辑封装到中介者对象中,从而使得对象之间的耦合度降低到最低。
  • 中介者模式使得对象之间的交互逻辑可以灵活地改变,而不需要修改对象之间的引用关系。
  • 中介者模式遵循开闭原则,新的同事类可以很容易地添加到系统中,而不会影响到原有的代码。

(4) 中介者模式的缺点LYu28资讯网——每日最新资讯28at.com

  • 中介者模式中,中介者对象通常需要知道所有的同事类,可能会导致中介者对象的职责过重。

3.解释器模式

它定义了一种语言的文法,并解析相应的语句。解释器模式通过定义语言的文法,将文法中的每个规则映射到一个类,然后通过递归的方式解析语句。LYu28资讯网——每日最新资讯28at.com

(1) 解释器模式的结构LYu28资讯网——每日最新资讯28at.com

解释器模式的核心是解释器类,它封装了解释语句的逻辑。解释器类通常包含一个或多个解释方法,用于解释语句的不同部分。LYu28资讯网——每日最新资讯28at.com

以下是解释器模式的基本结构:LYu28资讯网——每日最新资讯28at.com

# 抽象表达式类class AbstractExpression:    def interpret(self, context):        pass# 终结符表达式类class TerminalExpression(AbstractExpression):    def interpret(self, context):        # 解释终结符表达式的逻辑        pass# 非终结符表达式类class NonterminalExpression(AbstractExpression):    def __init__(self):        self.expressions = []    def add_expression(self, expression):        self.expressions.append(expression)    def interpret(self, context):        # 解释非终结符表达式的逻辑        for expression in self.expressions:            expression.interpret(context)# 上下文类class Context:    def __init__(self):        self.input = None        self.output = None# 客户端代码if __name__ == "__main__":    context = Context()    # 构建语法树    expression1 = TerminalExpression()    expression2 = NonterminalExpression()    expression3 = TerminalExpression()    expression2.add_expression(expression1)    expression2.add_expression(expression3)    # 解释语句    expression2.interpret(context)

(2) 解释器模式的应用场景LYu28资讯网——每日最新资讯28at.com

解释器模式适用于以下场景:LYu28资讯网——每日最新资讯28at.com

  • 一种语言的文法比较简单,且文法的规则可以通过类来表达。
  • 需要解析和执行一种特定的语言。

(3) 解释器模式的优点LYu28资讯网——每日最新资讯28at.com

  • 解释器模式将解释语句的逻辑封装到解释器类中,使得解释语句的逻辑可以灵活地改变。
  • 解释器模式遵循开闭原则,新的解释器类可以很容易地添加到系统中,而不会影响到原有的代码。

(4) 解释器模式的缺点LYu28资讯网——每日最新资讯28at.com

  • 解释器模式中,解释器类通常需要知道所有的语法规则,可能会导致解释器类的职责过重。

本文链接:http://www.28at.com/showinfo-26-92108-0.htmlPython 实现命令模式、中介者模式和解释器模式

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: .NET 中的数据交互:生成和读取YAML文件

下一篇: Vite 是什么(并且为什么如此流行)?

标签:
  • 热门焦点
  • Find N3入网:最高支持16+1TB

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • 十个可以手动编写的 JavaScript 数组 API

    JavaScript 中有很多API,使用得当,会很方便,省力不少。 你知道它的原理吗? 今天这篇文章,我们将对它们进行一次小总结。现在开始吧。1.forEach()forEach()用于遍历数组接收一参
  • CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • JavaScript学习 -AES加密算法

    引言在当今数字化时代,前端应用程序扮演着重要角色,用户的敏感数据经常在前端进行加密和解密操作。然而,这样的操作在网络传输和存储中可能会受到恶意攻击的威胁。为了确保数据
  • 电视息屏休眠仍有网络上传 爱奇艺被质疑“薅消费者羊毛”

    记者丨宁晓敏 见习生丨汗青出品丨鳌头财经(theSankei) 前不久,爱奇艺发布了一份亮眼的一季报,不仅营收和会员营收创造历史最佳表现,其运营利润也连续6个月实现增长。自去年年初
  • 一条抖音4亿人围观 ! 这家MCN比无忧传媒还野

    作者:Hiu 来源:互联网品牌官01 擦边少女空降热搜,幕后推手曝光被网友誉为“纯欲天花板”的女网红井川里予,近期因为一组哥特风照片登上热搜,引发了一场互联网世界关于
  • 大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • OPPO K11搭载长寿版100W超级闪充:26分钟充满100%

    据此前官方宣布,OPPO将于7月25日也就是今天下午14:30举办新品发布会,届时全新的OPPO K11将正式与大家见面,将主打旗舰影像,和同档位竞品相比,其最大的卖
  • OPPO K11采用全方位护眼屏:三大护眼能力减轻视觉疲劳

    日前OPPO官方宣布,全新的OPPO K11将于7月25日正式发布,将主打旗舰影像,和同档位竞品相比,其最大的卖点就是将配备索尼IMX890主摄,堪称是2000档位影像表
Top