• 策略模式


    场景:

    以字符串替代为例:

    有一个文件,我们需要读取后,希望替代其中相应的变量,然后输出。关于替代其中变量的方法可能有多种方法,这取决于用户的要求,所以我们要准备几套变量字符替代方案。

    创建一个抽象类RepTempRule。

    View Code
    package designModel.stratrgy;
    
    public abstract class RepTempRule {
        
        protected String oldString = "" ;
        
        public void setOldString(String oldString){
            this.oldString = oldString ;
        }
        
        protected String newString = "" ;
        
        public String getNewString(){
            return newString ;
        }
        
        public abstract String replace() throws Exception ;
    }

    在RepTempRule 中 有一个抽象方法abstract 需要继承明确,这个replace 里其实是替代的
    具体方法.
    我们现在有两个字符替代方案,
    1.将文本中aaa 替代成bbb;
    2.将文本中aaa 替代成ccc;
    对应的类分别是RepTempRuleOne和RepTempRuleTwo

    package designModel.stratrgy;
    
    public class RepTempRuleOne extends RepTempRule{
    
        public RepTempRuleOne(String oldString){
            this.oldString = oldString ;
        }
        
        public String replace() throws Exception {
            newString = oldString.replaceFirst("aaa", "bbbb") ;
            System.out.println("this is the repalce one !");
            return newString ;
        }
        
    }

    RepTempRuleTwo

    package designModel.stratrgy;
    
    public class RepTempRuleTwo extends RepTempRule{
    
        public RepTempRuleTwo(String oldString){
            this.oldString = oldString ;
        }
        
        public String replace() throws Exception {
            newString = oldString.replaceFirst("aaa", "ccc");
            System.out.println("this is the replace two ! ");
            return newString ;
        }
        
    }

    建立一个算法解决类,用来提供客户端可以自由选择算法。

    package designModel.stratrgy;
    
    public class RepTempRuleSolve {
        
        private RepTempRule strategy;
        
        public RepTempRuleSolve(RepTempRule rule){
            this.strategy=rule;
        }
        
        public String getNewContext() throws Exception {
            return strategy.replace();
        }
        
        /**
         * 改变策略
         * @param newAlgorithm
         */
        public void changeAlgorithm(RepTempRule newAlgorithm) {
            strategy = newAlgorithm;
        }
    }

    调用:

    package designModel.stratrgy;
    
    /**
     * 通过策略模式,我们达到了在运行期间自由切换算法的目的。
     * 整个Strategy的核心部分就是抽象类的使用,使用策略模式可以在用户需求变化时,
     * 修改量很少,而且速度很快。
     * 适用场合:
     * 1、以不同格式保存文件;
     * 2、以不同算法压缩文件
     * 3、以不同是算法截获图像。
     * @author slpei
     *
     */
    public class Test {
        public static void main(String args[]) throws Exception{
            
            String newString = "" ;
            
            //使用第一套替代方案
            RepTempRuleSolve solver=new RepTempRuleSolve(new RepTempRuleOne("aaabncv"));
            newString = solver.getNewContext();
            System.out.println(newString);
            
            //使用第二套
            solver.changeAlgorithm(new RepTempRuleTwo("aaabncv")) ;
            newString = solver.getNewContext();
            System.out.println(newString);
        }
    }

    在Test类中我们可以自由切换算法

  • 相关阅读:
    数据结构-顺序表
    数据结构-概论
    社交网络图中结点的“重要性”计算 (30 分) C++解法
    面向对象程序设计--Java语言第二周编程题:有秒计时的数字时钟
    面向对象程序设计--Java语言第三周编程题:查找里程
    面向对象程序设计--Java语言第一周编程题:分数
    剑指Offer_#42_连续子数组的最大和
    vue--模态框背景不动解决方案
    redis(十七):Redis 安装,部署(WINDOWS环境下)
    redis(二十一):Redis 架构模式实现(哨兵)
  • 原文地址:https://www.cnblogs.com/peislin/p/2576135.html
Copyright © 2020-2023  润新知