• 【设计模式】行为型01策略模式(strategy patten)


         学设计模式一段时间了,有些懂了,有些半知半解,通过写笔记博客的方式总结一下:

         关于策略模式,我的个人理解就是将一些经常变动的算法独立抽取出来,可以是一个方法,也可以是一个策略类,这样,如果有需求变更,只需要添加新的策略类然后进行调用切换即可。

         虽然个人使用时一般是抽取为方法,但是以面向对象的角度以及书上的类图来看,采用策略类比较符合面向对象的思想。当然也不必墨守成规,灵活健壮清晰可读即可,不必过度去设计。

     

    策略模式

    1、场景:

    用于经常变动的业务场景或算法。

    2、类图:

    整个策略的消费者,对应类图中的Context:

    package com.pat.stratage;
    /**
     * 策略消费者
     * @author Administrator
     *
     */
    public class Context {
    	//策略对象
    	private Stratage stratage;
    	
    	public void calculate() {
    		//调用策略类中的具体策略
    		stratage.algo();
    	}
    	
    	//构造方法
    	public Context() {}
    	public Context(Stratage stratage) {
    		this.stratage=stratage;
    	}
    		
    }
    

    策略的接口类:

    package com.pat.stratage;
    /**
     * 具体策略接口
     * @author Administrator
     *
     */
    public interface Stratage {
    	public void algo();
    }
    

    具体策略1

    package com.pat.stratage;
    /**
     * 策略实现类1
     * @author Administrator
     *
     */
    public class StratageA implements Stratage{
    
    	@Override
    	public void algo() {
    		System.out.println("执行策略A");
    		
    	}
    
    }
    

    具体策略2

    package com.pat.stratage;
    
    public class StratageB implements Stratage{
    
    	@Override
    	public void algo() {
    		System.out.println("执行策略B");
    		
    	}
    
    }
    

    具体策略3

    package com.pat.stratage;
    
    public class StratageC implements Stratage{
    
    	@Override
    	public void algo() {
    		System.out.println("执行策略C");
    		
    	}
    
    }
    

    测试:

    package com.pat.stratage;
    
    public class TestStratage {
        public static void main(String[] args) {
            //生产策略A对象
            Stratage str = new StratageA();
            //构造消费者对象
            Context con = new Context(str);
            //调用方法
            con.calculate();
            
            //生产策略B对象
            Stratage str2 = new StratageB();
            //构造消费者对象
            Context con2 = new Context(str2);
            //调用方法
            con2.calculate();
        }
    }
    
    
    
    控制台打印结果:
    执行策略A
    执行策略B
    

    3、拓展提升:

    上面只是策略模式的基本用法,还可以横向扩展或与其它设计模式结合,从而更灵活的运用。

    例如,每个策略都需要传入参数返回计算完成的结果等等,这里不多解释了,记住核心,随机应变即可。

       

     
     
     
     
  • 相关阅读:
    Vue.js学习笔记 第五篇 事件处理
    多sheet导出核心代码
    jeecg查询备份
    输入URL 一瞬间发生了什么
    get post 的区别
    Redis所需内存 超过可用内存怎么办
    MySQL联合索引
    常用的sql
    MySQL 时间类型字段的分析
    PHP各个版本的区别
  • 原文地址:https://www.cnblogs.com/the-fool/p/11054209.html
Copyright © 2020-2023  润新知