设计模式(21)--策略模式

策略模式即解决问题的策略。当我们需要解决某个问题时,可能会有多种解决问题的办法,这时候,可以将每个办法看成一个策略,我们可以选择其中一个合适策略来解决问题。同时,我们可以方便的更换策略或者增加策略。

策略模式比较容易理解,该模式通过增加一个抽象策略类来定义策略角色。而我们面向抽象编程,使策略模式变得容易扩展。

举例:

小明去上学,可以走路,可以骑自行车,可以坐公交车,他的每一种去学校方式都可以看作解决”去学校“这个问题的策略。去学校是目的,去学校方式是过程,而策略模式所带来的便利恰恰是为你在这个过程中提供多个选择。

策略模式很好的体现了一句外国名言:条条大路通罗马(All roads lead to Rome)

策略模式UML类图:


其实这副类图是我从上个状态模式类图上简单修改得到的,这也能看出,有时候我们其实类的结构类的关系是差不多的,但为了解决不同问题,我们人为给它赋予了模式名称。

示例代码:

环境类(使用策略的类):

/*****
 * 环境类
 * @author wjw
 *
 */
public class Context {
	private Strategy strategy;
	public Context(Strategy strategy){
		this.strategy = strategy;
	}
	/*****
	 * 去学校方法
	 */
	public void gotoSchool(){
	System.out.println("小明--" + strategy.howToGetToSchool() + "--去学校!");	
	}
}


抽象策略类:

/*******
 * 抽象策略类
 * @author wjw
 *
 */
public abstract class Strategy {

	public abstract String howToGetToSchool();
}


步行 骑车 公交车策略类:

/****
 * 步行策略类
 * @author wjw
 *
 */
public class WalkStrategy extends Strategy{

	@Override
	public String howToGetToSchool() {
		// TODO Auto-generated method stub
		return "步行";
	}

}



/****
 * 骑车策略类
 * @author wjw
 *
 */
public class RideStrategy extends Strategy{

	@Override
	public String howToGetToSchool() {
		// TODO Auto-generated method stub
		return "骑自行车";
	}

}

/****
 * 公交策略类
 * @author wjw
 *
 */
public class BusStrategy extends Strategy{

	@Override
	public String howToGetToSchool() {
		// TODO Auto-generated method stub
		return "公交车";
	}

}

Main类:


public class Main {

	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
		//利用反射,通过配置文件new具体策略对象
		Class strategyClazz = Class.forName(ReadProperties.readProperties("strategy_name"));
		Strategy strategy = (Strategy)strategyClazz.newInstance();
		Context context = new Context(strategy);
		context.gotoSchool();
	}
}

运行结果:


小明--骑自行车--去学校!


说明:实例代码通过选择不同策略上学来讲解策略模式,通过反射,在运行期选择具体策略。该示例代码很好理解,主要是理解了策略模式的定义。

设计模式是一个润物细无声的东西,你没感觉用到他,可能你已经用了,因为人会不自觉的选择好的方法去解决问题,哪怕没学过设计模式,也许也能摸索出自己的设计模式。你感觉这设计模式用处不大,可能到真的用到,就可以解决大问题。


如有错误,欢迎指正

end


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值