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

    【策略模式】

    也称为政策模式。

    定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。

    策略模式由三部分组成:

    * Strategy抽象策略角色(例子中的Soldier接口)

    策略、算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法或属性。

    * ConcreteStrategy具体策略橘色(例子中的SniperSoldier和ScoutSoldier)

    实现抽象策略角色的操作,即具体的方法。

    * Context封装角色(例子中的General将军类)

    也叫作上下文角色,其承上启下的作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在变化。

    【策略模式 例子】

    package com.Higgin.Strategy;
    
    /**
     * 士兵接口
     * Strategy抽象策略角色
     */
    interface Soldier{
        public void shoot();
    }
    
    /**
     * 狙击手类
     * ConcreteStrategy具体策略角色
     */
    class SniperSoldier implements Soldier{
        @Override
        public void shoot() {
            System.out.println("狙击手用狙击枪射击!!!");
        }
    }
    /**
     * 侦察兵类
     * ConcreteStrategy具体策略角色
     */
    class ScoutSoldier implements Soldier{
        @Override
        public void shoot() {
            System.out.println("侦查兵用突击步枪射击!!!");
        }
    }
    /**
     * 将军类
     * Context封装角色
     */
    class General{
        private Soldier soldier;   //关联士兵接口
        public General(Soldier soldier){
            this.soldier=soldier;
        }
        public void command(){   //将军下令
            this.soldier.shoot();
        }
    }
    
    public class TestStrategy {
        public static void main(String[] args) {
            General general;
            
            System.out.println("近距离有敌人...");
            general=new General(new ScoutSoldier());
            general.command(); //将军下令
            
            System.out.println("==================");
            
            System.out.println("远距离有敌人...");
            general=new General(new SniperSoldier());
            general.command();  //将军下令
            
        }
    }

    【运行结果】

    【策略模式的优点】

    * 算法可以自由切换,只要实现抽象策略角色,他就会成为策略家族的一个成员,通过封装角色对其进行封装,保证对外提供“可自由切换”的策略。

    * 避免多重条件判断

    策略模式有5个策略算法,一会要使用A策略,一会又要使用B策略,使用多重条件判断语句不易维护,且出错的概率大大增加,使用策略模式后,可以自由由其他模块来决定采用何种策略,策略家族对外提供的访问接口就是封装类,简化了操作,同时避免了条件语句判断。

    * 扩展性好

    在现有的系统中增加一个策略非常容易,只要实现接口即可,其他的都无需修改。符合OCP原则。

  • 相关阅读:
    【漏洞挖掘】攻击对外开放的Docker API接口
    使用密钥认证机制远程登录Linux
    极客时间-左耳听风-程序员攻略开篇-零基础启蒙
    WEBSHELL恶意代码批量提取清除工具
    string替换字符串,路径的斜杠替换为下划线
    Linux下文件的三个时间意义及用法
    记录一次lnmp故障报告
    Centos 7.2编译安装MariaDB-10.0.xx
    win 7 浏览器被篡改小插曲
    【 sysbench 性能基准测试 】
  • 原文地址:https://www.cnblogs.com/HigginCui/p/6222908.html
Copyright © 2011-2022 走看看