【问题标题】:Methodologies or patterns to disable/enable statements based on conditions?根据条件禁用/启用语句的方法或模式?
【发布时间】:2014-11-27 04:00:12
【问题描述】:

因此,基本上,如果设备具有互联网,则允许发生某些操作 如果没有互联网,则不允许运行某些操作。

在线模式和离线模式。

有哪些方法可以构建这种情况,有哪些模式可以使用?

首先想到的是一个标志作为条件和一个 if else 语句来处理代码选择。

online = true
getconnection()
if {!getconnection){
    online = false
}
if (online) {
    do everything online
}else {
    do only offline stuff
}

如果已经存在需要考虑此逻辑的现有代码库,那么针对这种情况的最佳补救措施是什么?

【问题讨论】:

  • 使用标志就足够了
  • 您需要检查连接检测吗?
  • 所以基本上保持简单使用 if else 语句来控制流程......

标签: java android design-patterns if-statement control-flow


【解决方案1】:

如果设备的连接状态保持不变,我会使用strategy 模式。

您可以有一个接口(策略)“Features”,带有一个“OnlineFeatures”实现和一个“OfflineFeatures”实现,或者您可以将每个单独的功能作为一个启用实现和禁用实现的策略。我通常会选择第 2 种以获得更大的灵活性,但根据应用程序设计的不同,这可能有点过头了。

如果连接状态需要动态更改,您仍然可以使用策略模式,但这取决于您需要在连接状态更改之间维护哪些状态信息。

作为一个例子(在 C++ 中,但我希望这个想法足够清楚): 假设我想要一个具有 2 个可能功能的计算器,能够加法和乘法。我想要一个只做添加的试用版,以及一个同时解锁两个功能的版本。

class IAddStrategy
{
  virtual int Add( int first, int second ) = 0;
}

class CAdd: public IAddStrategy
{
  virtual int Add( int first, int second ) override { return first + second; }
}

// if I wanted to disable add I could create a CDisabledAdd class

class IMultiplyStrategy
{
  virtual int Multiply( int first, int second ) = 0;
}

class CMultiply : public IMultiplyStrategy
{
  virtual int Multiply( int first, int second ) override { return first * second };
}

class CDisabledMultiply : public IMultiplyStrategy
{
  virtual int Multiply( int first, int second ) override { return 0; }
}

class CCalculator
{
  CCalculator( IAddStrategy &add, IMultiplyStrategy &multiply ) : _add(add), _multiply(multiply)

  int Add( int first, int second ) { return _add.add(first, second); }

  int Multiply( int first, int second ) { return _multiply.multiply(first, second); }

private:
  IAddStrategy &_add;
  IMultiplyStrategy &_multiply;
}

// You don't necessarily need a factory. If features enabled/disabled status needed to change dynamically, I would need set methods for the strategies on calculator as well.
class CCalculatorFactory
{
  CCalculator *CreateTrialCalculator() { return new CCalculator( new CAdd(), new CDisabledMultiply() ); }
  CCalculator *CreateCalculator() { return new CCalculator( new CAdd(), new CMultiply() ); }
}

我只是为我的禁用版本返回 0,但您可以实现您的类以提供足够的信息来提供更有用的反馈,或者让实现自己绘制适当的 ui 反馈。

【讨论】:

  • 感谢您对模式的描述。你能提供一个简单的代码示例吗?
  • 希望对@sirvon有所帮助。
  • 谢谢你,我要和这个前任一起跑步。并弄清楚如何实现。在爪哇。似乎所有关于拆分代码功能并实现它们的模块样式..这就是我需要的。
【解决方案2】:

也许这段代码会有所帮助:

if (CheckNetworkStatus.getInstance(context).isOnline()) {
    //do online stuff
} else {
    //do offline stuff
}

【讨论】:

  • 我真的更想根据某些条件寻找更好的方法来控制代码流。泰寿。
  • @sirvon 没问题老兄:)
猜你喜欢
  • 2015-08-24
  • 1970-01-01
  • 1970-01-01
  • 2015-09-13
  • 2021-10-06
  • 2014-11-28
  • 2015-11-16
  • 2016-04-28
  • 2019-12-13
相关资源
最近更新 更多