【问题标题】:Refactoring. Trying to make code more elegant. Need design pattern重构。试图让代码更优雅。需要设计模式
【发布时间】:2021-05-18 20:19:58
【问题描述】:

没有详细说明。我有这样的结构:

class someClass():
    def __init__(self, m):
        
        if m == 1:
            self.mode1()
        elif m == 2:
            self.mode2()
        elif m == 3:
            self.mode3()
        .....

        elif m == 10:
            self.mode10()

这是一个具有不同操作模式的类。将变量m 传递给我想设置运行类的相应方法的操作模式的类。有没有办法更优雅地做到这一点并摆脱“if”语句?对于这种特定情况,可能有一些设计模式吗?

【问题讨论】:

  • 传递行为。
  • 您所描述的在 C 和 C++ 中称为“switch case”结构。不幸的是,python 决定不使用这个标准。作为结构的替代,许多人使用字典映射,如下所示:geeksforgeeks.org/switch-case-in-python-replacement
  • 尝试策略模式。
  • 这是说你有一个可变的父类,我无法理解。你确定那是你想要做的吗? m 应该是 init 方法的参数吗?
  • 是的,m是init方法的参数。

标签: python oop design-patterns


【解决方案1】:

最终我使用了策略模式。感谢@Robin 的建议。

class Strategy(ABC):
    @abstractmethod
    def execute(self):
        pass   

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

    @property
    def strategy(self):
        return self._strategy

    @strategy.setter
    def strategy(self,  strategy: Strategy):
        self._strategy = strategy

    def executeStrategy(self):
        self._strategy.execute()

class mode0(Strategy):
    def execute(self):
        logging.info("MODE 0")
        
class mode1(Strategy):
    def execute(self):
        logging.info("MODE 1")
        
class mode2(Strategy):
    def execute(self):
        logging.info("MODE 2")
        
.....

然后

class someClass():
    def __init__(self, m):
        modesList = [mode0, mode1, mode2, mode3, mode4, mode5, 
                     mode6, mode7, mode8, mode9, mode10, mode11]      
    
        ctx = Context(modesList[m]())
        ctx.executeStrategy()
    

【讨论】:

    猜你喜欢
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    相关资源
    最近更新 更多