以商场收银为例,理解并实践“策略模式”。
一、面向过程的实现方式
1 package secondStrategy; 2 DecimalFormat; 3 public class StrategyTest { 4 public static void main(String[] args) { 5 // 营业员提供信息 6 double total=0; 7 double price=2; 8 int num=3; 9 String promotions="打8折";//或者“满100-30” 10 11 // 计算待付金额 12 double totalPrice=price*num; 13 total=total+totalPrice; 14 15 switch (promotions) { 16 case "打8折":total=total*0.8;break; 17 case "满100-30": total=total-(total/100)*30; // "/"取整。“%”取余 18 default: 19 break; 20 } 21 DecimalFormat df = new DecimalFormat("#.##"); // 如果写成0.00,结果就一定是两个小数 22 System.out.println("单价:"+price+";数量:"+num+";原价:"+totalPrice+";活动:"+promotions+";活动价:"+df.format(total)); 23 24 } 25 }
缺点:当有新的活动时,就要不停地复制程序代码,新增一个类别,这使程序的重复性增加,可维护性变差。
二、通过简单工厂实现
1、UML图结构
2、语言描述
三、通过策略模式来设计
1、UML图结构
2、文字描述
四、策略模式与工厂模式相结合
1、UML图结构
2、文字描述
3、java代码实现
1 package secondStrategy; 2 3 public abstract class CashSuper { 4 public abstract double acceptCash(double money); 5 }
1 package secondStrategy; 2 3 public class CashNormal extends CashSuper { 4 5 @Override 6 public double acceptCash(double money) { 7 return money; 8 } 9 10 }
1 package secondStrategy; 2 3 // 打折类 4 public class CashRebate extends CashSuper { 5 private double moneyRebate=0; 6 // 构造方法,初始化时应传入折扣 7 public CashRebate(double moneyRe) { 8 Rebate=moneyRe; 9 } 10 @Override 11 public double acceptCash(double money) { 12 double result=0; 13 result=money*moneyRebate; 14 return result; 15 } 16 17 }
1 package secondStrategy; 2 3 public class CashReturn extends CashSuper { 4 private double moneyCondition=0; //满减门槛 5 private double moneyReturn=0; // 满减金额 6 7 public CashReturn(double moneyCon,double moneyRe) { 8 // TODO Auto-generated constructor stub 9 Condition=moneyCon; 10 Return=moneyRe; 11 } 12 13 @Override 14 public double acceptCash(double money) { 15 double result=0; 16 result=money-(money/moneyCondition)*moneyReturn; 17 return result; 18 } 19 20 }
1 package secondStrategy; 2 3 public class CashContext { 4 private CashSuper cSuper; 5 public CashContext( String type) { 6 switch (type) { 7 case "打8折": this.cSuper=new CashRebate(0.8); break; 8 case "满100-30": this.cSuper=new CashReturn(100,30);break; 9 default:this.cSuper=new CashNormal(); 10 break; 11 } 12 } 13 public double getResult(double money){ 14 return this.cSuper.acceptCash(money); 15 } 16 }
package secondStrategy;DecimalFormat;public class StrategyTest {public static void main(String[] args) {// 营业员提供信息double total=0;double price=2;int num=3;String promotions="打8折";//或者“满100-30”// 计算待付金额double totalPrice=price*num;total=total+totalPrice;switch (promotions) {case "打8折":total=total*0.8;break;case "满100-30": total=total-(total/100)*30; // "/"取整。“%”取余default:break;}DecimalFormat df = new DecimalFormat("#.##"); // 如果写成0.00,结果就一定是两个小数System.out.println("单价:"+price+";数量:"+num+";原价:"+totalPrice+";活动:"+promotions+";活动价:"+df.format(total));} }
运行结果:
五、总结说明
1、定义:策略模式是一种 定义一系列算法的方法,从概念上看,所有这些算法完成的都是 相同的工作,只是实现不同。它可以有相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。 2、策略模式的Strategy类层次为Context定义了一系列可供重用的算法或行为。继承有助于析取出这些算法的公共功能——计费结果getResult()。 3、优点:4、特点:
转载于:.html
本文发布于:2024-02-02 04:54:04,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170682084941486.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |