ToB企服应用市场:ToB评测及商务社交产业平台

标题: 策略模式 [打印本页]

作者: 曂沅仴駦    时间: 2023-11-2 04:29
标题: 策略模式
策略模式

案例引入

duck项目

要求:
1.有各种鸭子,比如野鸭,北京鸭,水鸭等,鸭子有各种行为,比如叫,飞行。
2.显示鸭子的信息。
传统方式实现案例

1.抽象一个父类duck,有其子类,野鸭、北京鸭、水鸭等。
代码
  1. /**
  2. * @author 长名06
  3. * @version 1.0
  4. */
  5. public abstract class Duck {
  6.     public Duck(){
  7.     }
  8.     public abstract void display();
  9.     public void quack(){
  10.         System.out.println("鸭子嘎嘎叫");
  11.     }
  12.     public void swim(){
  13.         System.out.println("鸭子会游泳");
  14.     }
  15.     public void fly(){
  16.         System.out.println("鸭子会飞翔");
  17.     }
  18. }
  19. /**
  20. * @author 长名06
  21. * @version 1.0
  22. */
  23. public class ToyDuck extends Duck{
  24.     @Override
  25.     public void display() {
  26.         System.out.println("这是玩具鸭");
  27.     }
  28.     @Override
  29.     public void swim() {
  30.         System.out.println("玩具鸭不能游泳");
  31.     }
  32.     @Override
  33.     public void fly() {
  34.         System.out.println("玩具鸭不能飞");
  35.     }
  36.     @Override
  37.     public void quack() {
  38.         System.out.println("玩具鸭不能叫");
  39.     }
  40. }
  41. /**
  42. * @author 长名06
  43. * @version 1.0
  44. */
  45. public class WildDuck extends Duck{
  46.     @Override
  47.     public void display() {
  48.         System.out.println("这是野鸭");
  49.     }
  50. }
  51. /**
  52. * @author 长名06
  53. * @version 1.0
  54. */
  55. public class BeJingDuck extends Duck{
  56.     @Override
  57.     public void display() {
  58.         System.out.println("这是北京鸭");
  59.     }
  60.     //覆盖父类的fly方法
  61.     @Override
  62.     public void fly() {
  63.         System.out.println("北京鸭不能飞翔");
  64.     }
  65. }
复制代码
传统实现问题分析

基本介绍

原理类图


说明:从上图可以看到,客户Context,有成员变量strategy或者其他的策略接口,至于需要使用到那个策略,我们可以在构造器中指定。
策略模式实现案例

uml图


代码实现
  1. /**
  2. * @author 长名06
  3. * @version 1.0
  4. */
  5. public abstract class Duck {
  6.     //属性,策略接口
  7.     FlyBehavior flyBehavior;
  8.     public Duck(){
  9.     }
  10.     public abstract void display();
  11.     public void quack(){
  12.         System.out.println("鸭子嘎嘎叫");
  13.     }
  14.     public void swim(){
  15.         System.out.println("鸭子会游泳");
  16.     }
  17.     public void fly(){
  18.         if(flyBehavior != null){
  19.             flyBehavior.fly();
  20.         }
  21.     }
  22.     public void setFlyBehavior(FlyBehavior flyBehavior) {
  23.         this.flyBehavior = flyBehavior;
  24.     }
  25. }
  26. /**
  27. * @author 长名06
  28. * @version 1.0
  29. */
  30. public interface FlyBehavior {
  31.     void fly();
  32. }
  33. /**
  34. * @author 长名06
  35. * @version 1.0
  36. */
  37. public class GoodFlyBehavior implements FlyBehavior{
  38.     @Override
  39.     public void fly() {
  40.         System.out.println("飞翔技术很好");
  41.     }
  42. }
  43. /**
  44. * @author 长名06
  45. * @version 1.0
  46. */
  47. public class NoFlyBehavior implements FlyBehavior{
  48.     @Override
  49.     public void fly() {
  50.         System.out.println("不会飞");
  51.     }
  52. }
  53. /**
  54. * @author 长名06
  55. * @version 1.0
  56. */
  57. public class BadFlyBehavior implements FlyBehavior{
  58.     @Override
  59.     public void fly() {
  60.         System.out.println("飞翔技术还行");
  61.     }
  62. }
  63. /**
  64. * @author 长名06
  65. * @version 1.0
  66. */
  67. public class ToyDuck extends Duck {
  68.     public ToyDuck(){
  69.         flyBehavior = new NoFlyBehavior();
  70.     }
  71.     @Override
  72.     public void display() {
  73.         System.out.println("这是玩具鸭");
  74.     }
  75.     @Override
  76.     public void swim() {
  77.         System.out.println("玩具鸭不能游泳");
  78.     }
  79.     @Override
  80.     public void quack() {
  81.         System.out.println("玩具鸭不能叫");
  82.     }
  83. }
  84. /**
  85. * @author 长名06
  86. * @version 1.0
  87. */
  88. public class WildDuck extends Duck {
  89.     public WildDuck() {
  90.         flyBehavior = new GoodFlyBehavior();
  91.     }
  92.     @Override
  93.     public void display() {
  94.         System.out.println("这是野鸭");
  95.     }
  96. }
  97. /**
  98. * @author 长名06
  99. * @version 1.0
  100. */
  101. public class BeJingDuck extends Duck {
  102.     public BeJingDuck(){
  103.         flyBehavior = new BadFlyBehavior();
  104.     }
  105.     @Override
  106.     public void display() {
  107.         System.out.println("这是北京鸭");
  108.     }
  109. }
复制代码
策略模式在JDK-Arrays类的应用

1.JDK的Arrays的Comparator就使用了策略模式。
核心代码

[code]      Integer[] date = {1, 8, 3, 4, 2, 9};        //1.实现降序排列,返回-1放左边,1放右边,0保持不变        //2.comparator就是实现了 Comparator接口的匿名内部类的对象 相当于策略接口的实现类        //3.public int compare(Integer o1, Integer o2) 制定了具体的处理方式        Comparator comparator = new Comparator() {            public int compare(Integer o1, Integer o2) {                if(o1 > o2){                    return 1;                }else{                    return -1;                }            }        };        /**         *  public static  void sort(T[] a, Comparator




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4