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. 针对不同问题有不同解决办法时,可以考虑使用策略模式

  • 相关阅读:
    sed 命令编辑文本
    Iocomp控件教程之Pie Chart——饼状图控件
    《Go并发编程实战》第2版 紧跟Go的1.8版本号
    浅谈PHP数据结构之栈
    oracle11g导入dmp文件(根据用户)
    exp命令ORACLCE10G导出ORACLE11G的数据1455错误
    将war文件解压到指定目录
    JAVA包命名规范
    Eclipse中新建jsp文件访问页面时乱码问题
    网页编码就是那点事
  • 原文地址:https://www.cnblogs.com/glsy/p/11069271.html
Copyright © 2011-2022 走看看