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原则。

  • 相关阅读:
    完美解决CTRL+空格不能切换中/英文输入法的问题
    【Delphi内联汇编学习1】Delphi与汇编
    替换bmp图片中的颜色 good
    将四个BYTE数值转换成IEEE754标准的浮点数(两种方法:用Addr函数取字节数字的首地址,或者用Absolute关键字)
    在delphi的exe文件中嵌入另外一个exe文件
    Qt中的串口编程之三
    使用MIDAS访问远程Access数据库
    QSqlDatabase的进一步封装(多线程支持+更加简单的操作)——同时支持MySQL, SQL Server和Sqlite
    Qt for Linux:环境搭建(CentOS 6.5 32位)——完全从零安装
    Qt for Windows:使用WinPcap开发高性能UDP服务器
  • 原文地址:https://www.cnblogs.com/HigginCui/p/6222908.html
Copyright © 2011-2022 走看看