行为型模式-解释器模式

行为型模式-解释器模式

    • 解释器模式(Interpreter)
    • 解决语言解析问题
      • 描述
      • 适用环境
      • 优点:
      • 缺点:
      • 违反原则:
      • 代码实现

解释器模式(Interpreter)

解决语言解析问题

描述

定义一种语言,并解释该语言中的句子,从而执行特定的操作。这种方式适用于需要频繁地解析和执行某种语言或者规则的场景,如编译器、表达式计算等。

适用环境

当需要通过一种方式来解释语言或表达式时使用;当需要进行特定领域的编程时使用。

优点:

可以定义语言的文法,提高程序的灵活性;可以很容易地实现解释器。

缺点:

如果文法非常复杂,则可能导致系统的性能下降;可能会导致代码变得非常难以理解和维护。

违反原则:

开放-封闭原则:如果需要增加新的表达式,则需要修改所有的解释器,违反该原则。

代码实现

书店订单系统当查询订单时,需要根据不同的条件来查询订单信息。
现在使用传统的方式来处理订单查询:

class Book:
    def __init__(self, name, price):
        self.name = name
        self.price = price
    
class Order:
    def __init__(self):
        self.order_items = []

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

    def get_total_price(self):
        return sum([item.price for item in self.order_items])

book1 = Book('Python编程从入门到实践', 68.0)
book2 = Book('流畅的Python', 79.0)
order = Order()
order.add_item(book1)
order.add_item(book2)

# 查询总价
total_price = order.get_total_price()
print(f"订单总金额为{total_price}元")

以上代码存在以下问题:当需要支持更多查询条件时,需要修改原有的代码。代码难以扩展和维护。可以通过解释器模式来解决这个问题,具体实现如下:


# 创建一个抽象类Expression,定义一个抽象方法interpret()
# 具体子类需要实现该方法,并通过调用Context的相关方法来执行具体操作

from abc import ABC, abstractmethod

class Expression(ABC):
    @abstractmethod
    def interpret(self, context):
        pass

# 创建一个具体的Expression类,用于计算Order中所有图书的价格总和class TotalPriceExpression(Expression):
    def interpret(self, context):
        total_price = sum([item.price for item in context.order.order_items])
        context.total_price = total_price

# 创建一个Context类,用于保存需要计算的Order信息class Context:
    def __init__(self, order):
        self.order = order
        self.total_price = None

# 修改Order类,将查询条件进行解析并解释执行。class Order:
    def __init__(self):
        self.order_items = []

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

    def interpret(self, expression):
        context = Context(self)
        expression.interpret(context)
        return context.total_price

book1 = Book('Python编程从入门到实践', 68.0)
book2 = Book('流畅的Python', 79.0)
order = Order()
order.add_item(book1)
order.add_item(book2)

# 查询总价
total_price_expression = TotalPriceExpression()
total_price = order.interpret(total_price_expression)
print(f"订单总金额为{total_price}元")

你可能感兴趣的:(设计模式,解释器模式,python,开发语言)