注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

拥有自己的梦想,跟随心的召唤

平凡是福

 
 
 

日志

 
 

策略模式的一个简明例子  

2013-04-04 13:38:24|  分类: 设计模式 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
这个例子简单明了,对于学习策略模式能够提供很好的指引作用,故拿来分享一下。

未使用策略模式前的代码:
// 对List中所有数求和
List numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
public int sumAll(List numbers) {
    int total = 0;
    for (int number : numbers) {
        total += number;
    }
    return total;
}

// 对List中所有偶数求和
public int sumAllEven(List numbers) {
    int total = 0;
    for (int number : numbers) {
        if (number % 2 == 0) {
            total += number;
        }
    }
    return total;
}

// 对List中所有大于3的元素求和
public int sumAllEven(List numbers) {
    int total = 0;
    for (int number : numbers) {
        if (number > 3) {
            total += number;
        }
    }
    return total;
}
这三个方法可以从中发现很明显的“代码臭味”—— 代码重复,三个方法的唯一区别之处在于if判断这一行代码;利用策略模式重构代码后如下:
// 策略接口
public interface Strategy {
   public boolean test(int num);
}
// 求和策略 
public class SumAllStrategy implements Strategy {
   public boolean test(int num) {
      return true;
   }
}
// 偶数求和策略
public class SumAllEvenStrategy implements Strategy {
   public boolean test(int num) {
      return num % 2 == 0;
   }
}

public class ContextClass {
   private Strategy stragegy = null;
   private final static Strategy DEFAULT_STRATEGY = new SumAllStrategy();
 
   public ContextClass() {
      this(null);
   }
   // 在构造函数中传入求和策略
   public ContextClass(Stragegy stragegy) {
      if(strategy != null) {
         this.strategy = strategy;
      }
      else {
         this.strategy = DEFAULT_STRATEGY;
      }
   }
 
   public int sumAll(List numbers) {
      int total = 0;
      for (int number : numbers) {
         if (strategy.test(number)) {
            total += number;
         }
      }
 
      return total;
   }
}
 
// 调用
ContextClass context = new ContextClass();
context.sumAll(numbers);

另:如果不使用策略模式而使用 Java 8 的 Lambda 表达式中的谓词(Predicate),代码则更加简洁:
public int sumAll(List numbers, Predicate p) {
    int total = 0;
    for (int number : numbers) {
        if (p.test(number)) {
            total += number;
        }
    }
    return total;
}
 
sumAll(numbers, n -> true);
sumAll(numbers, n -> n % 2 == 0);
sumAll(numbers, n -> n > 3);

参考:
  评论这张
 
阅读(506)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017