Skip to content
百科百科
操作系统
设计模式
算法
题解
java
leetcode
  • 设计模式
    • /设计模式/设计模式 - 单例.md
      • /设计模式/设计模式 - 中介者.md
        • /设计模式/设计模式 - 享元.md
          • /设计模式/设计模式 - 代理.md
            • /设计模式/设计模式 - 原型模式.md
              • /设计模式/设计模式 - 命令.md
                • /设计模式/设计模式 - 备忘录.md
                  • /设计模式/设计模式 - 外观.md
                    • /设计模式/设计模式 - 工厂方法.md
                      • /设计模式/设计模式 - 抽象工厂.md
                        • /设计模式/设计模式 - 桥接.md
                          • /设计模式/设计模式 - 模板方法.md
                            • /设计模式/设计模式 - 状态.md
                              • /设计模式/设计模式 - 生成器.md
                                • /设计模式/设计模式 - 空对象.md
                                  • /设计模式/设计模式 - 策略.md
                                    • 9. 策略(Strategy)
                                      • Intent
                                        • Class Diagram
                                          • 与状态模式的比较
                                            • Implementation
                                              • JDK
                                            • /设计模式/设计模式 - 简单工厂.md
                                              • /设计模式/设计模式 - 组合.md
                                                • /设计模式/设计模式 - 装饰.md
                                                  • /设计模式/设计模式 - 观察者.md
                                                    • /设计模式/设计模式 - 解释器.md
                                                      • /设计模式/设计模式 - 访问者.md
                                                        • /设计模式/设计模式 - 责任链.md
                                                          • /设计模式/设计模式 - 迭代器.md
                                                            • /设计模式/设计模式 - 适配器.md
                                                              • 一、前言
                                                                • 一、概述
                                                                  • 设计模式目录

                                                                    2022年5月21日大约 2 分钟

                                                                    此页内容
                                                                    • 9. 策略(Strategy)
                                                                      • Intent
                                                                      • Class Diagram
                                                                      • 与状态模式的比较
                                                                      • Implementation
                                                                      • JDK

                                                                    # 9. 策略(Strategy)

                                                                    # Intent

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

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

                                                                    # Class Diagram

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

                                                                    img

                                                                    # 与状态模式的比较

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

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

                                                                    # Implementation

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

                                                                    public interface QuackBehavior {
                                                                        void quack();
                                                                    }
                                                                    
                                                                    public class Quack implements QuackBehavior {
                                                                        @Override
                                                                        public void quack() {
                                                                            System.out.println("quack!");
                                                                        }
                                                                    }
                                                                    
                                                                    public class Squeak implements QuackBehavior{
                                                                        @Override
                                                                        public void quack() {
                                                                            System.out.println("squeak!");
                                                                        }
                                                                    }
                                                                    
                                                                    public class Duck {
                                                                    
                                                                        private QuackBehavior quackBehavior;
                                                                    
                                                                        public void performQuack() {
                                                                            if (quackBehavior != null) {
                                                                                quackBehavior.quack();
                                                                            }
                                                                        }
                                                                    
                                                                        public void setQuackBehavior(QuackBehavior quackBehavior) {
                                                                            this.quackBehavior = quackBehavior;
                                                                        }
                                                                    }
                                                                    
                                                                    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();
                                                                        }
                                                                    }
                                                                    
                                                                    squeak!
                                                                    quack!
                                                                    

                                                                    # JDK

                                                                    • java.util.Comparator#compare()
                                                                    • javax.servlet.http.HttpServlet
                                                                    • javax.servlet.Filter#doFilter()
                                                                    编辑此页open in new window
                                                                    上次编辑于: 2022/5/21 13:08:59
                                                                    贡献者: yzqdev
                                                                    上一页
                                                                    /设计模式/设计模式 - 空对象.md
                                                                    下一页
                                                                    /设计模式/设计模式 - 简单工厂.md
                                                                    powered by vuepress-theme-home