【Java设计模式】策略模式

策略模式封装算法并使其可互换,由策略接口、具体策略类和依赖于策略的上下文组成。上下文允许策略对象共享,提高代码灵活性。优点包括松耦合和遵循开闭原则,便于扩展新策略无需修改客户端代码。

概念

策略模式
定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于它的客户而变化。
Strategy Pattern
Define a family of algorithms, encapsulate each one, and make them inter changeable. Strategy lets the algorithm vary independently from clients that use it.
引用自Design Pattern

这里的客户,是指使用算法的应用程序/调用方。

角色

  • 策略(Strategy):策略是一个接口,该接口定义若干个算法标识,即定义个若干个抽象方法。
  • 具体策略(Concrete Strategy):集体策略是实现策略接口的类,具体策略实现策略接口所定义的抽象方法,即给出算法标识的具体算法。
  • 上下文(Context):上下文是依赖于策略接口的类,即上下文包含有策略声明的变量。

策略模式的UML类图

策略模式的UML类图

代码示例

详见Gitee仓库代码Strategy包

上下文的作用是什么?能否不用上下文这个角色?

作用:实现策略对象的共享
如果不使用上下文这个角色的话,在其他应用程序里还需要创建新的具体策略的实例。而使用了上下文角色后,具体策略的实例创建过一次后就保存在上下文的策略成员的引用里了,在其他应用程序里再使用该策略时,直接调用上下文的方法即可。

未使用上下文的代码:

	String[] data = new String[]{"Jack", "Maya", "Mikes", "Shadow"};
	TableExporter tb;
	tb = new HtmlExporter();
	System.out.println(tb.getExported(data));
	tb = new LineExporter();
	System.out.println(tb.getExported(data));

使用了上下文的代码:

	String[] data = new String[]{"Jack", "Maya", "Mikes", "Shadow"};
	TableExporter tb = new HtmlExporter();
	Exporter e = new Exporter();
	Exporter.setStrategy(HtmlExporter);
	System.out.println(e.getExported(data));

策略模式的优点

松耦合:上下文和具体策略是松耦合的关系。上下文只知道某一个实现策略接口的实例,而不需要知道具体是哪个类
满足开闭原则:当增加新的具体策略时,不需要修改上下文类的代码。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值