目的

就是能动态改变你策略的策略,我的理解就是这个了。

正常情况下,我们写好一个算法就无法改变了,除非重新写一个函数。
但是策略模式却可以动态的改变算法。

UML

图片.png

效果

  1. 买入:3个商品
  2. 买入:5个商品
  3. ================================
  4. 开始结账
  5. 一共买入: 8个商品
  6. 每个商品: 6
  7. 没有促销
  8. 一共花费: 48.0
  9. ================================
  10. ================================
  11. 开始结账
  12. 一共买入: 8个商品
  13. 每个商品: 6
  14. 打五折
  15. 一共花费: 24.0
  16. ================================
  17. ================================
  18. 开始结账
  19. 一共买入: 8个商品
  20. 每个商品: 6
  21. 倒闭不要钱了
  22. 一共花费: 24.0
  23. ================================

完整代码

主要是通过子类继承同一个促销方案的父类,
然后将其他促销方案单作参数进行传递

  1. public class main {
  2. // 促销方案父类
  3. public static class sales {
  4. public double calc(int num, int price) {
  5. return 0;
  6. }
  7. }
  8. public static class noSales extends sales {
  9. public double calc(int num, int price) {
  10. System.out.println("没有促销");
  11. return num*price;
  12. }
  13. }
  14. public static class helfSales extends sales {
  15. public double calc(int num, int price) {
  16. System.out.println("打五折");
  17. return num*price*0.5;
  18. }
  19. }
  20. public static class freeSales extends sales {
  21. public double calc(int num, int price) {
  22. System.out.println("倒闭不要钱了");
  23. return num*price*0.5;
  24. }
  25. }
  26. public static class Market{
  27. int commidityNum = 0;
  28. int commidityPrice = 6;
  29. sales algorithm = new sales();
  30. public Market() {
  31. // TODO Auto-generated constructor stub
  32. }
  33. public void buy(int num) {
  34. commidityNum += num;
  35. System.out.println("买入:"+ num + "个商品");
  36. }
  37. public double CheckeOut(sales sales) {
  38. algorithm = sales;
  39. double total = 0;
  40. System.out.println("================================");
  41. System.out.println("开始结账");
  42. System.out.println("一共买入: " + commidityNum+"个商品");
  43. System.out.println("每个商品: " + commidityPrice+"元");
  44. total = algorithm.calc(commidityNum, commidityPrice);
  45. System.out.println("一共花费: "+ total + "元");
  46. System.out.println("================================");
  47. return total;
  48. }
  49. }
  50. public static void main(String[] args) {
  51. sales TnoSales = new noSales();
  52. sales ThelfSales = new helfSales();
  53. sales TfreeSales = new freeSales();
  54. Market test = new Market();
  55. test.buy(3);
  56. test.buy(5);
  57. // 传入相应的方法,实现响应的功能
  58. test.CheckeOut(TnoSales);
  59. test.CheckeOut(ThelfSales);
  60. test.CheckeOut(TfreeSales);
  61. }
  62. }