博客
关于我
二十三种设计模式(第二十二种)-----策略模式(Strategy)
阅读量:491 次
发布时间:2019-03-07

本文共 3197 字,大约阅读时间需要 10 分钟。

策略设计模式 - Strategy Pattern

类图说明

在鸭子设计模式中,Customer类持有一个strategy对象或相关策略接口。通过构造器可以指定使用的策略,从而实现不同的行为选择和.Example:

  • 野鸭、中原鸭、玩具鸭等不同鸭子类型,会有不同的行为表现,如叫、飞行、游泳等。

功能需求演示

1. 需求展示

系统需求包括以下几个方面:

  • 鸭子分类:识别不同种类的鸭子(如野鸭、中原鸭、水鸭等)。
  • 行为特征
    • 自然界鸭子表现出不同的行为特征:
      • :根据鸭子种类决定是否能叫。
      • 飞行:根据鸭子种类决定是否能飞行。
      • 游泳:根据鸭子种类决定是否能游泳。
  • 动态策略切换:能够根据不同的场景或需求,动态更换鸭子的行为策略。
  • 2. 功能设计特点

    通过策略模式设计,主要特征为:

  • 行为独立性:将鸭子的特定行为(如飞行)抽离出来作为独立的策略对象。
  • 便于扩展:可以通过 simply changing strategy 的方式,轻松增加新的鸭子类型或行为模式。
  • 灵活性高:允许在运行时根据具体需求选择不同的行为策略,灵活应对不同场景。
  • 实现代码示例

    // 鸭子抽象类public abstract class Duck {    protected FlyBehavior flyBehavior;    public abstract void display();    public void quack() {        System.out.println("鸭子嘎嘎叫~~~");    }    public void swim() {        System.out.println("鸭子会游泳~~~");    }    public void fly() {        if (flyBehavior != null) {            flyBehavior.fly();        }    }    public void setFlyBehavior(FlyBehavior flyBehavior) {        this.flyBehavior = flyBehavior;    }}// 飞行行为接口public interface FlyBehavior {    void fly();}// 不同鸭子接口实现类public class WildDuck extends Duck {    public WildDuck() {        flyBehavior = new GoodFlyBehavior();    }    @Override    public void display() {        System.out.println("这是野鸭....");    }}public class PekingDuck extends Duck {    public PekingDuck() {        flyBehavior = new BadFlyBehavior();    }    @Override    public void display() {        System.out.println("这是北京鸭子...");    }}public class ToyDuck extends Duck {    public ToyDuck() {        flyBehavior = new NoFlyBehavior();    }    @Override    public void display() {        System.out.println("这是玩具鸭...");    }    @Override    public void quack() {        System.out.println("玩具鸭不能叫...");    }    @Override    public void swim() {        System.out.println("玩具鸭不能游泳...");    }}// 不同飞行行为实现类public class GoodFlyBehavior implements FlyBehavior {    @Override    public void fly() {        System.out.println("飞翔技术高超...");    }}public class BadFlyBehavior implements FlyBehavior {    @Override    public void fly() {        System.out.println("飞翔技术一般...");    }}public class NoFlyBehavior implements FlyBehavior {    @Override    public void fly() {        System.out.println("不会飞...");    }}// 客户端public class StrategyDemo {    public static void main(String[] args) {        // 创建不同鸭子实例        WildDuck wildDuck = new WildDuck();        wildDuck.fly();        PekingDuck pekingDuck = new PekingDuck();        pekingDuck.fly();        ToyDuck toyDuck = new ToyDuck();        toyDuck.fly();        // 更换鸭子的飞行策略        pekingDuck.setFlyBehavior(new NoFlyBehavior());        pekingDuck.fly();    }}

    策略模式在JDK中的应用

    在JDK中,策略模式主要体现在Arrays.sort()方法的实现中。这个方法利用Comparator接口作为策略,通过动态选择合适的比较策略来排序数据。具体实现方式如下:

    public class Arrays {    public static void sort(Object[] a, Comparator
    c) { // 详细实现代码 }}

    Comparator接口的作用

    Comparator接口在这里充当策略角色,其核心作用是定义和提供具体的比较逻辑。不同的Comparator实例决定了排序的策略,系统可以通过动态地选择和切换不同的Comparator,从而改变排序的行为。

    优势体现

    • 灵活性:可以根据不同需求选择不同的比较策略。
    • 可扩展性:支持新增排序逻辑,只需提供新的Comparator实现类即可。
    • 非终止性:允许不同的Comparator不影响彼此的比较过程,系统保持稳定性。

    通过这种设计,JDK在效率和功能上达到了更好的平衡,为Java的排序算法提供了灵活的解决方案。

    总结

    策略模式通过将通用行为模式与具体实现方式分离开来,为系统提供了灵活的行为选择机制。在鸭子设计模式中,策略模式展示了如何通过动态设置不同的鸭鸟行为策略,实现便于扩展、易于维护的设计。在JDK的实现中,策略模式点亮了Comparator接口的重要性,展示了其在性能和功能上的双重价值。这种设计思路为应用程序的灵活配置和扩展奠定了坚实基础。

    转载地址:http://kmbcz.baihongyu.com/

    你可能感兴趣的文章
    nginx 配置~~~本身就是一个静态资源的服务器
    查看>>
    Nginx下配置codeigniter框架方法
    查看>>
    nginx添加模块与https支持
    查看>>
    Nginx的Rewrite正则表达式,匹配非某单词
    查看>>
    Nginx的使用总结(一)
    查看>>
    Nginx的是什么?干什么用的?
    查看>>
    Nginx访问控制_登陆权限的控制(http_auth_basic_module)
    查看>>
    nginx负载均衡器处理session共享的几种方法(转)
    查看>>
    nginx负载均衡的5种策略(转载)
    查看>>
    nginx负载均衡的五种算法
    查看>>
    Nginx配置ssl实现https
    查看>>
    Nginx配置TCP代理指南
    查看>>
    Nginx配置代理解决本地html进行ajax请求接口跨域问题
    查看>>
    Nginx配置参数中文说明
    查看>>
    Nginx配置好ssl,但$_SERVER[‘HTTPS‘]取不到值
    查看>>
    Nginx配置实例-负载均衡实例:平均访问多台服务器
    查看>>
    NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
    查看>>
    Nio ByteBuffer组件读写指针切换原理与常用方法
    查看>>
    NIO Selector实现原理
    查看>>
    nio 中channel和buffer的基本使用
    查看>>