策略模式

打印 上一主题 下一主题

主题 890|帖子 890|积分 2670

策略模式

案例引入

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. }
复制代码
传统实现问题分析


  • 1.其它鸭子,都继承了Duck类,所以fly让所有子类都会飞了,这是不正确的。
  • 2.问题1其实是继承的问题,对类的局部改动,尤其超类的局部改动,会影响其他部分。有溢出效应。
  • 3.为了改进1问题,我们可以覆盖fly方法,来解决
  • 4.如果我们有一个玩具鸭子ToyDuck,这样就需要ToyDuck去覆盖Duck的所有实现方法 => 解决思路 策略模式(Strategy Pattern)
基本介绍


  • 1.策略模式(Strategy Pattern)中,定义算法簇,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的用户。
  • 2.此模式,体现了几种设计原则。第一,将变化的代码从不变的代码分离;第二,针对接口编程而不是具体的类(定义策略模式接口);第三,多用组合/聚合,少用继承(客户通过组合方式使用策略)。
原理类图


说明:从上图可以看到,客户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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

曂沅仴駦

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表