策略模式:策略模式是一种定义一系列算法的方法,算法完成的工作都是相同的工作,但是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。
Java实现一个策略模式:
需求:商场收银系统,收银方式为正常收费,打八折,满300返100,这三种收费方式。
1:创建一个超类。即收费的抽象方法。
public abstract class CashSuper { public abstract double acceptCash(double money); }
2:创建实现此超类的类。
public class CashNormal extends CashSuper { @Override public double acceptCash(double money) { return money; } }
3:根据商场收费方式的不同,创建三种收费方式的具体实现算法类
/**打折子类 * 获取打折折扣,使用应付金额乘以折扣 * @author 我不是张英俊 * */ public class CashRebate extends CashSuper { private double moneyRebate=1; public CashRebate(String moneyRebate){ this.moneyRebate=Double.parseDouble(moneyRebate); } @Override public double acceptCash(double money) { return money*moneyRebate; } }
/**返利收费子类,例如,满三百减一百 * @author 我不是张英俊 * */ public class CashReturn extends CashSuper { /** * 返利收费,初始化时必须要输入返利条件和返利值,比如慢300时返100, * 则moneyCondition为300,moneyRetrun 为100 */ private double moneyCondition=0; private double moneyReturn=0; public CashReturn(String moneyCondition,String moneyReturn){ this.moneyCondition=Double.parseDouble(moneyCondition); this.moneyReturn=Double.parseDouble(moneyReturn); } @Override public double acceptCash(double money) { double result=money; if(money>=moneyCondition){ result=money-Math.floor(money/moneyCondition)*moneyReturn; } return result; } }
/** *正常收费的,原价返回 * @author 我不是张英俊 * */ public class CashNormal extends CashSuper { @Override public double acceptCash(double money) { return money; } }
4:写一个Context来通过同一个方法进行 不同付费方式的实现。因为需要创建不同的对象,所以需要结合简单工厂模式来实现。
public class CashContext { private CashSuper cs=null; public CashContext(String type){ switch (type) { case "正常收费": CashNormal cs0=new CashNormal(); cs=cs0; break; case "满300返100": CashReturn cr1=new CashReturn("300", "100"); cs=cr1; break; case "打八折": CashRebate cr2=new CashRebate("0.8"); cs=cr2; break; } } public double GetResult(double money){ return cs.acceptCash(money); } }
5:测试类
public class Test { public static void main(String[] args) { double a=new CashContext("打八折").GetResult(300); System.out.println(a); double b=new CashContext("正常收费").GetResult(300); System.out.println(b); double c=new CashContext("满300返100").GetResult(300); System.out.println(c); } }
6:控制台。
240.0
300.0
200.0
总结:策略模式简化了单元测试,因为每个算法都是自己的类,可以通过自己的接口单独测试。
策略模式是用来封装算法的,但是在实际使用过程中,可以用他来封装几所任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。
自己感悟:总的来说,策略模式对算法进行了封装,例如功夫熊猫,继承动物的超类之后,既需要有实现语言的功能,又需要实现功夫的功能,使用策略模式,将各个算法分开,在使用的时候可以很好的组合在一起。
忍者必须死34399账号登录版 最新版v1.0.138v2.0.72
下载勇者秘境oppo版 安卓版v1.0.5
下载忍者必须死3一加版 最新版v1.0.138v2.0.72
下载绝世仙王官方正版 最新安卓版v1.0.49
下载Goat Simulator 3手机版 安卓版v1.0.8.2
Goat Simulator 3手机版是一个非常有趣的模拟游
Goat Simulator 3国际服 安卓版v1.0.8.2
Goat Simulator 3国际版是一个非常有趣的山羊模
烟花燃放模拟器中文版 2025最新版v1.0
烟花燃放模拟器是款仿真的烟花绽放模拟器类型单机小游戏,全方位
我的世界动漫世界 手机版v友y整合
我的世界动漫世界模组整合包是一款加入了动漫元素的素材整合包,
我的世界贝爷生存整合包 最新版v隔壁老王
我的世界MITE贝爷生存整合包是一款根据原版MC制作的魔改整