【设计模式】行为型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、拓展提升:

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

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

   

 
 
 
 
原文地址:https://www.cnblogs.com/the-fool/p/11054209.html