龗孖 龗孖
首页
  • JAVA
  • 设计模式
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 页面

    • HTML
    • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

靇孖

某微型企业非牛逼技术专家。
首页
  • JAVA
  • 设计模式
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 页面

    • HTML
    • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 设计模式
  • 设计模式-单例
  • 设计模式-中介者
  • 设计模式-享元
  • 设计模式-代理
  • 设计模式-原型模式
  • 设计模式-命令
  • 设计模式-备忘录
  • 设计模式-外观
  • 设计模式-工厂方法
  • 设计模式-抽象工厂
  • 设计模式-桥接
  • 设计模式-模板方法
  • 设计模式-状态
  • 设计模式-生成器
  • 设计模式-空对象
  • 设计模式-策略
    • 9. 策略(Strategy)
      • Intent
      • Class Diagram
      • 与状态模式的比较
      • Implementation
      • JDK
  • 设计模式-简单工厂
  • 设计模式-组合
  • 设计模式-装饰
  • 设计模式-观察者
  • 设计模式-解释器
  • 设计模式-访问者
  • 设计模式-责任链
  • 设计模式-迭代器
  • 设计模式-适配器
  • 设计模式
  • 设计模式
龗孖
2023-07-20
目录

设计模式-策略

# 9. 策略(Strategy)

# Intent

定义一系列算法,封装每个算法,并使它们可以互换。

策略模式可以让算法独立于使用它的客户端。

# Class Diagram

  • Strategy 接口定义了一个算法族,它们都实现了 behavior() 方法。
  • Context 是使用到该算法族的类,其中的 doSomething() 方法会调用 behavior(),setStrategy(Strategy) 方法可以动态地改变 strategy 对象,也就是说能动态地改变 Context 所使用的算法。

# 与状态模式的比较

状态模式的类图和策略模式类似,并且都是能够动态改变对象的行为。但是状态模式是通过状态转移来改变 Context 所组合的 State 对象,而策略模式是通过 Context 本身的决策来改变组合的 Strategy 对象。所谓的状态转移,是指 Context 在运行过程中由于一些条件发生改变而使得 State 对象发生改变,注意必须要是在运行过程中。

状态模式主要是用来解决状态转移的问题,当状态发生转移了,那么 Context 对象就会改变它的行为;而策略模式主要是用来封装一组可以互相替代的算法族,并且可以根据需要动态地去替换 Context 使用的算法。

# Implementation

设计一个鸭子,它可以动态地改变叫声。这里的算法族是鸭子的叫声行为。

public interface QuackBehavior {
    void quack();
}
1
2
3
public class Quack implements QuackBehavior {
    @Override
    public void quack() {
        System.out.println("quack!");
    }
}
1
2
3
4
5
6
public class Squeak implements QuackBehavior{
    @Override
    public void quack() {
        System.out.println("squeak!");
    }
}
1
2
3
4
5
6
public class Duck {

    private QuackBehavior quackBehavior;

    public void performQuack() {
        if (quackBehavior != null) {
            quackBehavior.quack();
        }
    }

    public void setQuackBehavior(QuackBehavior quackBehavior) {
        this.quackBehavior = quackBehavior;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Client {

    public static void main(String[] args) {
        Duck duck = new Duck();
        duck.setQuackBehavior(new Squeak());
        duck.performQuack();
        duck.setQuackBehavior(new Quack());
        duck.performQuack();
    }
}
1
2
3
4
5
6
7
8
9
10
squeak!
quack!
1
2

# JDK

  • java.util.Comparator#compare()
  • javax.servlet.http.HttpServlet
  • javax.servlet.Filter#doFilter()
上次更新: 2024/11/03, 21:31:17
设计模式-空对象
设计模式-简单工厂

← 设计模式-空对象 设计模式-简单工厂→

最近更新
01
树中两个节点的最低公共祖先
10-17
02
hexo多平台多博客网站同步
09-04
03
最长不含重复字符的子字符串
09-03
更多文章>
Theme by Vdoing | Copyright © 2015-2024 Ling ma | 996.icu | 京ICP备16011424号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式