设计模式笔记—策略模式

策略模式

      概念

       定义一系列算法,并将每一个算法封装起来,而且使它们可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

          使用场景

               1)针对同一类型问题的多种处理方式,仅仅是具体行为有差别时。

                   2)需要安全地封装多种同一类型的操作时。

                   3)出现同一抽象类有多个子类,而又需要使用if-else或者swich-case来选择具体子类时。

         案例:交通计费

         没有使用策略时:

public class PriceCalculator {
	private static final int BUS=1;
	private static final int SUBWAY=2;
	public static void main(String[] args) {
		PriceCalculator calculator = new PriceCalculator();
		System.out.println("坐15公里的公交车票价为:"+calculator.calculatePrice(15,BUS));
		System.out.println("坐15公里的地铁票价为:"+calculator.calculatePrice(15,SUBWAY));
	}
	//公交车计费,十公里之内一元钱,之外每加一元钱可以乘5公里
	private int busPrice(int km){
		//超过10公里的总距离
		int extraTotal=km-10;
		//超过的距离是5的公里倍数
		int extraFactor=extraTotal /5;
		//超过的距离对5公里取余
		int fraction=extraTotal % 5;
		//价格计算
		int price=1+extraFactor*1;
		return fraction>0?++price:price;
	}
	//地铁计费  6公里内 3元  6<=km<=12公里 4元 12<=km<=22公里 5元  22<=km<=32公里 6元 
	private int subwayPrice(int km){
		if(km<=6){
			return 3;
		}else if(km>6 && km<12){
			return 4;
		}else if(km>12 && km <22){
			return 5;
		}else if(km>22 && km<32){
			return 6;
		}
		return 7;
	}
	int  calculatePrice(int km,int type){
		if(type==BUS){
			return busPrice(km);
		}else if(type==SUBWAY){
			return subwayPrice(km);
		}
		return 0;
	}
}
        分析:PriceCalculator类中的代码很明显的问题是没有使用单一职责,如果再多增加一些类别的交通工具计费,比如增加一个taxi计费,就得修改calculatePrice方法中的代码,增加一个分支判断,那么这个类中的代码逐渐会变得非常臃肿,且不好维护。

       使用策略模式重构后

public interface CalculateStrategy {
	//按距离来计算价格
	int calculatePrice(int km);
}
public class BusStrategy implements CalculateStrategy {
	//公交车计费,十公里之内一元钱,之外每加一元钱可以乘5公里
	@Override
	public int calculatePrice(int km) {
		//超过10公里的总距离
		int extraTotal=km-10;
		//超过的距离是5的公里倍数
		int extraFactor=extraTotal /5;
		//超过的距离对5公里取余
		int fraction=extraTotal % 5;
		//价格计算
		int price=1+extraFactor*1;
		return fraction>0?++price:price;
	}
}

     
public class SubwayStrategy implements CalculateStrategy{
	//地铁计费  6公里内 3元  6<=km<=12公里 4元 12<=km<=22公里 5元  22<=km<=32公里 6元 
	@Override
	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;
		}else if(km>22 && km<32){
			return 6;
		}
		return 7;
	}
}
public class TranficCalculator {
public static void main(String[] args) {
	TranficCalculator calculator = new TranficCalculator();
	//设置计算策略
	calculator.setmStrategy(new BusStrategy());
	//计算价格
	System.out.println("公交车乘15公里的价格:"+calculator.calculatePrice(15));
}
//这一部分代码可以单独放在一个类中
CalculateStrategy mStrategy;
//使用set方法注入依赖
public void setmStrategy(CalculateStrategy mStrategy) {
	this.mStrategy = mStrategy;
}
public int calculatePrice(int km){
	return mStrategy.calculatePrice(km);
}
}
        结果:

公交车乘15公里的价格:2
        假如需要添加出租车方式的计费,只需要添加一个出租车计算策略类,然后在TranficCalculator中set进去如下:

public class TaixStrategy implements CalculateStrategy{
	//价格 公里*3
	@Override
	public int calculatePrice(int km) {
		return km*3;
	}
}

       TranficCalculator calculator = new TranficCalculator();
	//设置计算策略
	calculator.setmStrategy(new TaixStrategy ());

       分析:这种方式通过建立抽象,将不同的策略构建成一个具体的策略实现,通过不同的策略实现算法的替换,简化了逻辑,结构,还增强了可读性,稳定性,扩展性。

       策略模式优缺点

              优点:1) 算法可以自由替换 2) 避免使用多重条件判断 3) 扩展性良好。
              缺点:1) 策略类数量增多    2)所有的策略类都需要对外暴露




CCF大数据与计算智能大赛-面向电信行业存量用户的智能套餐个性化匹配模型联通赛-复赛第二名-【多分类,embedding】.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值