【问题标题】:Multiple Conditions and Object Creation using Design Pattern使用设计模式创建多个条件和对象
【发布时间】:2019-10-30 01:09:01
【问题描述】:

我正在研究设计模式,我可以实现它以达到与以下相同的目的。但是,我被困住了,因为网上的大多数例子都很简单。

我尝试过查看工厂方法甚至策略方法,但不知道是否可以使用它们。

这里的大师有什么建议吗?

def checkSomething():
   if ...:
      return True
   else:
      return False

def main(mode, state):
   if checkSomething() == False:
      if mode == False or (mode == True and state == False):
         obj_a = Class_A()
         return obj_a
      else:
         Class_B().run()
         obj_c = Class_C()
         return obj_c

【问题讨论】:

  • 如何在同一个函数中返回布尔值或对象?
  • 抱歉,我可以直接返回 obj_a。没必要一定是False。

标签: python design-patterns


【解决方案1】:
  1. 您可以返回一对或元组,其中第一部分可能是一些指示类型的枚举。
  2. 您可以创建一个基类并从公共基类派生您的返回类类型。在这里,您需要将程序设计为依赖于基类而不是派生类型。

【讨论】:

    【解决方案2】:

    我个人的想法

    工厂模式在这里选择退出:您不仅在创建对象,而且还让它们做一些事情

    状态机在这里选择退出:这里没有状态转换

    所以我使用下面的策略模式。但我认为您仍然可以在顶部使用工厂模式,以便进一步将创建对象的关注与策略类分开。

    这里有一些 C# 伪代码:

    interface IClass
    {
        void Run();
    }
    
    class Class_A : IClass { ... }
    class Class_B : IClass { ... }
    class Class_C : IClass { ... }
    
    interface IStrategy
    {
        IClass Execute();
    }
    
    class StrategyA : IStrategy
    {
        IClass IStrategy.Execute()
        {
            var obj_a = Class_A();
            return obj_a;
        }
    }
    
    class StrategyB : IStrategy
    {
        IClass IStrategy.Execute()
        {
            Class_B.Run();
            var obj_c = Class_C();
            return obj_c;
        }
    }
    
    
    class DecisionMaker
    {
        private IStrategy _strategy;
    
        public DecideStrategy(IStrategy strategy) => _strategy = strategy;
    
        public IClass ExecuteStrategy() => _strategy.Execute();
    }
    
    main()
    {
        var decisionMaker = new decisionMaker();
        if conditionA
            decisionMaker.DecideStrategy(new StrategyA());
        else if conditionB
            decisionMaker.DecideStrategy(new StrategyB());
    
        return decisionMaker.ExecuteStrategy();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-24
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多