策略模式

《android设计模式》读书笔记,如有侵权,请联系我,删除


一。概要
  实现一个功能可以有多种算法或策略,我们根据实际情况来选择不同的算法或策略来完成该功能。如排序算法
  对于这种情况,常规的写法是将多种算法写在一个类中,然后每个方法对应一种具体的实现(如算法),然后根据一些条件使用 if...else..或switch来选择。但是,当很多算法都集中在一个类中的时候,类就会变的臃肿,难以维护。
  可以将这些算法或策略抽象出来,提供一个统一的接口,不同的算法或策略由不同的实现类,这样在客户端就可以通过注入不同的实现对象来实现算法或策略的动态替换,这种模式的可扩展性,可维护性就更高,这就是策略模式
二。使用场景
  (1)针对同一类型问题的多种处理方式,仅仅是具体行为由差别时。
  (2)需要安全的分装多种同一类型的操作时 
  (3)出现同一抽象类有多个子类,而又需要使用if...else或者switch...case来选择具体的子类时
三。具体实现
********************************************************************************************
package com.yinazh.designpattern;

public interface CalculateStrategy{
int calculatePrice(int km);
}

public class BusStrategy implements CalculateStrategy{
public int calculatePrice(int km){
int exteraTotal = km -10;
int extraFactor = exteraTotal / 5 ;
int fraction = extraFactor % 5;
int price = 1 +extraFactor * 1;
return fraction > 0 ? ++price : price;
}
}

public class SubwayStrategy implements CalculateStrategy{
public int calculatePrice(int km){
if(km <= 6){
return 3;
}else if(km > 6 && km < 12){
return 4;
}else if(km > 12 && km < 22){
return 5;
}
return 7;
}
}

public class TranficCalculator{
public static void main(String[] args){
TranficCalculator calculator = new TranficCalculator();
calculator.setStrategy(new BusStrategy());
System.out.println(calculator.calculatePrice(16));;
}
CalculateStrategy mStrategy;
public void setStrategy(CalculateStrategy mStrategy){
this.mStrategy = mStrategy;
}
public int calculatePrice(int km){
return mStrategy.calculatePrice(km);
}
}
********************************************************************************************
四。总结
  策略模式主要用来分离算法,在相同的行为抽象下有不同的具体实现策略。该模式很好的实现了封闭原则,也就是定义抽象,注入不同的实现,从而达到很好的可扩展性。
  结构清晰明了,而耦合度较低,但随着策略的增加,子类也会变得繁多。
五。与工厂模式的区别
  虽然在模式结构上相似,但是,二者不同点在于:
(1)工厂模式主要用于创建对象,而策略模式主要让一个对象在许多行为中选择一种行为。
(2)工厂模式注重对象的创建,而策略模式注重行为的封装
(3)工厂模式接受指令,创建出符合要求的实例,主要解决资源的同意分发,将对象独立创建出来,让对象的创建和具体使用与客户无关,主要应用在数据库的选择,库文件加载等。而策略模式是为了策略的切换与扩展。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值