• 第二节:策略模式——基本介绍&应用


    一、策略模式

      1、基本介绍

        (1)策略模式(Strategy Pattern)中,定义算法族(策略组),分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户

        (2)这算法体现了几个设计原则:

            第一:把变化的代码从不变的代码中分离出来;

            第二:针对接口编程而不是具体类(定义了策略接口);

            第三:多用组合/聚合,少用继承(客户通过组合方式使用策略);

      2、原理类图

        

         说明,从上图可以看到,客户 context 有成员变量 strategy 或者其他的策略接口,至于需要使用到那个策略,我们可以在构造器或者 setter 方法指定。

    二、策略模式解决鸭子问题

      1、实例要求

        编写程序完成前面的鸭子项目,要求使用策略模式;

      2、思路分析

        策略模式:分别封装行为接口,实现算法族,超类里放行为接口对象,在子类里具体设定行为对象。

        原则就是:分离变化部分,封装接口,基于接口编程各种功能。

        此模式让行为的变化独立于算法的使用者。

        

      3、代码实现

        策略接口:

    1 public interface FlyBehavior {
    2 
    3     /**
    4      * 子类具体实现
    5      */
    6     void fly();
    7 }

        接口实现类:

     1 public class GoodFlyBehavior implements FlyBehavior{
     2     @Override
     3     public void fly() {
     4         System.out.println("飞翔技术高超~~~");
     5     }
     6 }
     7 -----------------------------------------------
     8 public class BadFlyBehavior implements FlyBehavior{
     9     @Override
    10     public void fly() {
    11         System.out.println("飞翔技术一般~");
    12     }
    13 }
    14 
    15 -----------------------------------------------
    16 public class NoFlyBehavior implements FlyBehavior{
    17     @Override
    18     public void fly() {
    19         System.out.println("不会飞翔");
    20     }
    21 }

      鸭子抽象类:

     1 public abstract class Duck {
     2 
     3     /**
     4      * 属性,策略接口
     5      */
     6     FlyBehavior flyBehavior;
     7     //还会有其他属性 <-> 策略接口
     8 
     9     public Duck() {
    10 
    11     }
    12 
    13     /**
    14      * 显示鸭子信息
    15      */
    16     public abstract void display();
    17 
    18     public void fly() {
    19         if (flyBehavior != null) {
    20             flyBehavior.fly();
    21         }
    22     }
    23 
    24     public void setFlyBehavior(FlyBehavior flyBehavior) {
    25         this.flyBehavior = flyBehavior;
    26     }
    27 }

      具体实现鸭子类:

     1 public class WildDuck extends Duck{
     2 
     3     public WildDuck() {
     4         flyBehavior = new GoodFlyBehavior();
     5     }
     6 
     7     @Override
     8     public void display() {
     9         System.out.println("这是野鸭");
    10     }
    11 
    12 }
    13 -------------------------------------------------
    14 public class PekingDuck extends Duck{
    15 
    16     public PekingDuck() {
    17         flyBehavior = new BadFlyBehavior();
    18     }
    19 
    20     @Override
    21     public void display() {
    22         System.out.println("~~~北京鸭~~~");
    23     }
    24 
    25 }
    26 -------------------------------------------------
    27 public class ToyDuck extends Duck{
    28 
    29     public ToyDuck() {
    30         flyBehavior = new NoFlyBehavior();
    31     }
    32 
    33     @Override
    34     public void display() {
    35         System.out.println("~~~玩具鸭~~~");
    36     }
    37 }

      客户端:

     1 public class Client {
     2     public static void main(String[] args) {
     3         WildDuck wildDuck = new WildDuck();
     4         wildDuck.fly();
     5 
     6         ToyDuck toyDuck = new ToyDuck();
     7         toyDuck.fly();
     8 
     9         PekingDuck pekingDuck = new PekingDuck();
    10         pekingDuck.fly();
    11 
    12         //动态改变某个对象的行为
    13         pekingDuck.setFlyBehavior(new NoFlyBehavior());
    14 
    15         System.out.println("北京鸭的实际飞翔能力");
    16         pekingDuck.fly();
    17     }
    18 }

     

  • 相关阅读:
    [SCM]软件配置管理
    Jenkins入门总结
    Linux sh/bash[精华]
    [BRE]软件构建发布自动化
    python总结
    代码质量第 3 层 可读的代码
    记一次 WinDbg 分析 .NET 某工厂MES系统 内存泄漏分析
    记一次 .NET 某消防物联网 后台服务 内存泄漏分析
    Covariant(协变)与 Contravariant(逆变)
    三藩市湾区一周游
  • 原文地址:https://www.cnblogs.com/niujifei/p/14477551.html
Copyright © 2020-2023  润新知