
以商场收银为例,理解并实践“策略模式”。
一、面向过程的实现方式
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 条评论) |