java策略模式 简书_java 设计模式 - 策略模式

本文介绍策略模式的概念及其在商场打折计算器中的应用案例。通过定义一系列可互换的算法,策略模式能够减少算法类与使用算法类之间的耦合,并简化单元测试过程。

一、概念

策略模式:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。

二、使用示例

现在有一个需求,做一个商场打折计算器,根据客户所购买的单价和数量,进行结算。

我们把打折活动看成是商场的活动策略

public abstract class Strategy {

public abstract void algorithm();

}

打八折看成策略A

//具体算法A

public class ChildStrategyA extends Strategy {

@Override

public void algorithm() {

//算法A实现方法

System.out.print("算法A计算");

Log.i("test","算法A计算");

}

}

满300减100看成策略B

//具体算法B

public class ChildStrategyB extends Strategy {

@Override

public void algorithm() {

//算法A实现方法

System.out.print("算法B计算");

Log.i("test","算法B计算");

}

}

正常收费

//具体算法C

public class ChildStrategyC extends Strategy {

@Override

public void algorithm() {

//算法A实现方法

Log.i("test","算法C计算");

}

}

收费计算类

public class Cashier {

Strategy strategy;

public Cashier(Strategy strategy) {

this.strategy = strategy;

}

public void account(){

strategy.algorithm();

}

}

三种活动收费,调用代码

val cashier1 = Cashier(ChildStrategyA())

val cashier2 = Cashier(ChildStrategyB())

val cashier3 = Cashier(ChildStrategyC())

cashier1.account()

cashier2.account()

cashier3.account()

由于实例化不同的策略,所以最终在调用account()方法时,所获得的结果就不尽相同。结果:

算法A计算

算法B计算

算法C计算

虽然达到了我们想要的结果,但是还不是真正意义上的策略。其实,以真实商场活动环境,正常收费是一种策略,打折收费是一种策略,返利收费又是一种策略,也就是策略模式中说的具体算法。

现在我们根据上面三种策略,改写一下上面的代码:

//此处用了策略模式和简单工厂模式结合,如果只用简单工厂模式,我们就会有一个CashFactory.createCashType(String type)返回一个CashSuper。由于只使用简单工厂模式,需要知道两个类CashFactory和CashSuper所以,我们这里为了更好的封装细节,采用策略模式和简单工厂模式结合,对外只暴露CashContext一个类就可以了。

public class CashContext {

CashSuper cashSuper = null;

public CashContext(String type) {

switch (type) {

case "正常收费":

CashNormal cashNormal = new CashNormal();

cashSuper = cashNormal;

break;

case "满300 返 100":

CashReturn cashReturn = new CashReturn("300", "100");

cashSuper = cashReturn;

break;

case "8折":

CashRebate cashRebate = new CashRebate("0.8");

cashSuper = cashRebate;

break;

}

}

public double getResult(double money) {

return cashSuper.acceptCash(money);

}

}

//正常现金收费类

public class CashNormal extends CashSuper {

@Override

public double acceptCash(double money) {

return money;

}

}

//打折收费类

public class CashRebate extends CashSuper {

private double moneyRebate = 1d;

public CashRebate(String moneyRebate) {

this.moneyRebate = Double.parseDouble(moneyRebate);

}

@Override

public double acceptCash(double money) {

return money * moneyRebate;

}

}

//打折收费类

public class CashRebate extends CashSuper {

private double moneyRebate = 1d;

public CashRebate(String moneyRebate) {

this.moneyRebate = Double.parseDouble(moneyRebate);

}

@Override

public double acceptCash(double money) {

return money * moneyRebate;

}

}

调用代码

Double total = 0d;

CashContext cashContext = CashContext("8折");

//买了四件单价100元的秋裤

total += cashContext.getResult((100 * 4).toDouble());

测试结果:

total cost : 320.0

三、策略模式的解析

通过以上示例,我们发现,策略模式是一种定义一系列算法的方法,从概念上看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有算法,减少了各种算法类与使用算法类之间的耦合。最多的好处是,简单化了单元测试,每个算法都有自己的类,可以通过自己的接口单独测试,也减少了大量的条件语句判断。所以,以后我们在实践中,只要在分析过程中听到需要在不同实践应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。

先展示下效果 https://pan.quark.cn/s/a4b39357ea24 遗传算法 - 简书 遗传算法的理论是根据达尔文进化论而设计出来的算法: 人类是朝着好的方向(最优解)进化,进化过程中,会自动选择优良基因,淘汰劣等基因。 遗传算法(英语:genetic algorithm (GA) )是计算数学中用于解决最佳化的搜索算法,是进化算法的一种。 进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传、突变、自然选择、杂交等。 搜索算法的共同特征为: 首先组成一组候选解 依据某些适应性条件测算这些候选解的适应度 根据适应度保留某些候选解,放弃其他候选解 对保留的候选解进行某些操作,生成新的候选解 遗传算法流程 遗传算法的一般步骤 my_fitness函数 评估每条染色体所对应个体的适应度 升序排列适应度评估值,选出 前 parent_number 个 个体作为 待选 parent 种群(适应度函数的值越小越好) 从 待选 parent 种群 中随机选择 2 个个体作为父方和母方。 抽取父母双方的染色体,进行交叉,产生 2 个子代。 (交叉概率) 对子代(parent + 生成的 child)的染色体进行变异。 (变异概率) 重复3,4,5步骤,直到新种群(parentnumber + childnumber)的产生。 循环以上步骤直至找到满意的解。 名词解释 交叉概率:两个个体进行交配的概率。 例如,交配概率为0.8,则80%的“夫妻”会生育后代。 变异概率:所有的基因中发生变异的占总体的比例。 GA函数 适应度函数 适应度函数由解决的问题决定。 举一个平方和的例子。 简单的平方和问题 求函数的最小值,其中每个变量的取值区间都是 [-1, ...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值