MST

星途 面试题库

面试题:JavaScript类装饰器模式在复杂场景中的应用

假设有一个电商系统,有`Product`类用于表示商品,包含`price`属性和`getDetails`方法。现在需要实现一个类装饰器,根据用户角色(如'admin'、'customer')来动态修改`getDetails`方法的行为。对于'admin'角色,`getDetails`返回商品的完整信息,包括成本价;对于'customer'角色,`getDetails`只返回商品名称和售价。请给出`Product`类、装饰器以及如何根据不同角色应用装饰器的完整代码示例,并解释设计思路。
48.3万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
class Product:
    def __init__(self, name, price, cost_price):
        self.name = name
        self.price = price
        self.cost_price = cost_price

    def getDetails(self):
        return f"Name: {self.name}, Price: {self.price}"


def role_based_decorator(role):
    def decorator(cls):
        def new_getDetails(self):
            if role == 'admin':
                return f"Name: {self.name}, Price: {self.price}, Cost Price: {self.cost_price}"
            elif role == 'customer':
                return f"Name: {self.name}, Price: {self.price}"
            else:
                return "Invalid role"
        cls.getDetails = new_getDetails
        return cls
    return decorator


# 应用装饰器
@role_based_decorator('admin')
class AdminProduct(Product):
    pass


@role_based_decorator('customer')
class CustomerProduct(Product):
    pass


# 测试
admin_product = AdminProduct("Sample Product", 100, 50)
print(admin_product.getDetails())

customer_product = CustomerProduct("Sample Product", 100, 50)
print(customer_product.getDetails())

设计思路

  1. Product类:定义了商品的基本属性namepricecost_price和方法getDetails,初始的getDetails方法返回商品名称和售价。
  2. 装饰器role_based_decorator是一个类装饰器,接收一个role参数。它返回一个内部装饰器decorator,该内部装饰器接收一个类cls作为参数。在内部装饰器中,定义了一个新的getDetails方法,根据传入的role决定返回商品的详细信息。然后将新的getDetails方法替换原类的getDetails方法,并返回修改后的类。
  3. 应用装饰器:通过@role_based_decorator('admin')@role_based_decorator('customer')分别对Product类进行装饰,创建出AdminProductCustomerProduct类,它们的getDetails方法根据不同角色有不同的行为。