根据条件禁用/启用语句的方法或模式?

时间:2014-11-27 04:00:12

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

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

在线模式&离线模式。

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

我想到的一个明显的问题是作为条件的标志和处理代码选择的if else语句。

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

如果已经存在需要此逻辑的现有代码库,那么该情况的最佳补救措施是什么呢?

2 个答案:

答案 0 :(得分:1)

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

您可以拥有一个接口(策略)'功能',具有'OnlineFeatures'实现和'OfflineFeatures'实现,或者您可以将每个单独的功能作为具有已启用实现和禁用实现的策略。我通常会选择第二个以获得更大的灵活性,但根据应用程序的设计,它可能有点过分。

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

作为一个例子(在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反馈。

答案 1 :(得分:0)

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

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