策略模式

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。其中JDK里面的TreeSet类和TreeMap类就用到了策略模式。这两个类是带排序的集合类,其中排序的规则就相当于策略模式里定义的一系列算法,而集合类就相当于是策略模式里的环境类,供用户使用,用只知道TreeSet和TreeMap是带排序的,至于怎么排序的,是由排序的算法决定的。

策略模式由三部分组成:抽象策略角色,具体策略角色,环境角色。

抽象策略角色:策略类,通常由一个接口或者抽象类实现。

具体策略角色:实现了抽象策略类,并包装了相关的算法和行为。

环境角色:持有一个策略类的引用,最终给客户端调用。

下面提供一个简单的策略模式的代码实例:

1.抽象策略角色:定义一个接口Strategy。

package com.test;

/**
 * 策略模式抽象角色
 * @author zhouwen
 *
 */
public interface Strategy {

	public int calculate(int a, int b);
}

2.具体策略角色:实现Strategy接口。例子中是实现加减乘除的运算。

package com.test;

/**
 * 策略模式具体策略类
 * 实现加法运算
 * @author zhouwen
 *
 */
public class AddStrategy implements Strategy {

	@Override
	public int calculate(int a, int b) {
		return a + b;
	}

}

package com.test;

/**
 * 策略模式具体策略类
 * 实现减法运算
 * @author zhouwen
 *
 */
public class SubtractStrategy implements Strategy {

	@Override
	public int calculate(int a, int b) {
		return a - b;
	}

}

package com.test;

/**
 * 策略模式具体策略类
 * 实现乘法运算
 * @author zhouwen
 *
 */
public class MultiplyStragety implements Strategy {

	@Override
	public int calculate(int a, int b) {
		return a * b;
	}

}

package com.test;

/**
 * 策略模式具体策略类
 * 实现除法运算
 * @author zhouwen
 *
 */
public class DivideStrategy implements Strategy {

	@Override
	public int calculate(int a, int b) {
		return a / b;
	}

}

3.环境角色:在环境角色中定义一个抽象角色的引用,并暴露出计算的方法,供客户端调用。

package com.test;

/**
 * 策略模式环境类
 * @author zhouwen
 *
 */
public class Environment {

	private Strategy strategy;
	
	public Environment(Strategy strategy){
		this.strategy = strategy;
	}
	
	//用以改变策略
	public void setStrategy(Strategy strategy){
		this.strategy = strategy;
	}
	
	public Strategy getStrategy(){
		return strategy;
	}
	
	//暴露计算的接口,供客户端调用
	public int calculate(int a, int b){
		return strategy.calculate(a, b);
	}
}

4.最后编写客户端的代码:

package com.test;

public class Client {

	public static void main(String[] args) {
		
		AddStrategy addStrategy = new AddStrategy();
		Environment environment = new Environment(addStrategy);
		System.out.println(environment.calculate(3, 4));
		
		SubtractStrategy subStrategy = new SubtractStrategy();
		environment.setStrategy(subStrategy);
		System.out.println(environment.calculate(3, 4));
		
		MultiplyStragety multiplyStrategy = new MultiplyStragety();
		environment.setStrategy(multiplyStrategy);
		System.out.println(environment.calculate(3, 4));
		
		DivideStrategy divideStrategy = new DivideStrategy();
		environment.setStrategy(divideStrategy);
		System.out.println(environment.calculate(3, 4));
	}

}

总结:由客户端的System.out.println(environment.calculate(3, 4));这句代码,我们并不知道具体调用的是哪个实现类,只有知道了传给环境角色的具体策略类我们才知道调用哪个类,这样就能实现客户端和具体策略算法的分离,使程序 易于切换、易于理解、易于扩展。


策略模式的优缺点:

优点:

1.策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得他们可以相互替换。如提供的例子中通过set方法对策略进行替换。

2.策略模式使得算法可以在不影响客户端的情况下发生变化。使用策略模式可以把行为和环境分隔开。

3.环境类负责维持和查询行为类,各类算法则在具体策略中提供。由于算法和环境独立开来,算法的修改不会影响环境和客户端。

缺点:

1.客户端必须知道所有的策略类,并自行决定使用哪一个策略类。

2.会造成很多的策略类。


Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值