zoukankan      html  css  js  c++  java
  • 策略模式

    一、模式名

    策略, Strategy

    二、解决的问题

    策略,这个词中国人应该不陌生,从古代的孙子兵法,到现代的毛主席军事思想,无不充斥着策略。策略可以看做是解决问题的一种思想、办法,比如古代攻城略地,一般会使用强攻、水淹、火烧、离间、围城打援、心理战等,这些都是攻城的策略,当然这些策略有好有坏。在软件设计中,也存在很多策略,即一个问题有多种解决方法,每种解决方法可能针对不同的问题,或者每种解决方法有不同的特性,比如性能等。

    策略模式一般会定义一个策略接口或抽象类,用于定义解决问题的策略方法,具体的策略方法交给子类去实现。客户端可以使用不同的策略完成对应的任务。

    策略模式的优点:

    1. 策略可以完整替换,当需要修改策略时,只需切换另一个已有策略,或者新增一个策略子类,再完成切换。

    三、解决方案

    策略模式的UML图如下所示。

    clipboard

    代码如下:

    public class StrategyTest {
        public static void main(String[] args) {
            AttackStrategy attackStrategy= new WeichengdayuanStrategy();
            Commander commander = new Commander(attackStrategy);
            commander.battle();
        }
    }
    
    class Commander {
        private AttackStrategy strategy;
    
        public Commander(AttackStrategy strategy) {
            this.strategy = strategy;
        }
    
        public void battle() {
            System.out.println("准备作战");
    
            strategy.attack();
    
            System.out.println("作战完成");
        }
    }
    
    interface AttackStrategy {
        void attack();
    }
    
    class WeichengdayuanStrategy implements AttackStrategy {
        @Override
        public void attack() {
            System.out.println("围城打援");
        }
    }
    
    class QianggongStrategy implements AttackStrategy {
        @Override
        public void attack() {
            System.out.println("强攻");
        }
    }

    策略模式和工厂模式结合实践,代码如下:

    // 新建一个策略简单工厂
    class AttackStrategyFactory {
        public AttackStrategy create(int type) {
            if (type == 1) {
                return new WeichengdayuanStrategy();
            } else {
                return new QianggongStrategy();
            }
        }
    }
    
    public class StrategyTest {
        public static void main(String[] args) {
            AttackStrategy attackStrategy = new AttackStrategyFactory().create(1);
            Commander commander = new Commander(attackStrategy);
            commander.battle();
        }
    }

    常见应用场景:

    1. 针对不同问题有不同解决办法时,可以考虑使用策略模式

  • 相关阅读:
    Typescript类、命名空间、模块
    TypeScript 基础类型、变量声明、函数、联合类型、接口
    JS中的单线程与多线程、事件循环与消息队列、宏任务与微任务
    wangEditor上传本地视频
    java版excel转pdf,word转pdf
    idea2019.3 没有 Autoscroll from Source
    mysql 实现类似oracle函数bitand功能
    spring boot 配置文件动态更新原理 以Nacos为例
    spring boot 发布自动生成svn版本号
    spring boot JPA 数据库连接池释放
  • 原文地址:https://www.cnblogs.com/glsy/p/11069271.html
Copyright © 2011-2022 走看看