策略模式
一、模式名
策略, Strategy
二、解决的问题
策略,这个词中国人应该不陌生,从古代的孙子兵法,到现代的毛主席军事思想,无不充斥着策略。策略可以看做是解决问题的一种思想、办法,比如古代攻城略地,一般会使用强攻、水淹、火烧、离间、围城打援、心理战等,这些都是攻城的策略,当然这些策略有好有坏。在软件设计中,也存在很多策略,即一个问题有多种解决方法,每种解决方法可能针对不同的问题,或者每种解决方法有不同的特性,比如性能等。
策略模式一般会定义一个策略接口或抽象类,用于定义解决问题的策略方法,具体的策略方法交给子类去实现。客户端可以使用不同的策略完成对应的任务。
策略模式的优点:
1. 策略可以完整替换,当需要修改策略时,只需切换另一个已有策略,或者新增一个策略子类,再完成切换。
三、解决方案
策略模式的UML图如下所示。
代码如下:
public class StrategyTest { public static void main(String[] args) { AttackStrategy attackStrategy= new WeichengdayuanStrategy(); Commander commander = new Commander(attackStrategy); commander.battle(); } } class Commander { private AttackStrategy strategy; public Commander(AttackStrategy strategy) { this.strategy = strategy; } public void battle() { System.out.println("准备作战"); strategy.attack(); System.out.println("作战完成"); } } interface AttackStrategy { void attack(); } class WeichengdayuanStrategy implements AttackStrategy { @Override public void attack() { System.out.println("围城打援"); } } class QianggongStrategy implements AttackStrategy { @Override public void attack() { System.out.println("强攻"); } }
策略模式和工厂模式结合实践,代码如下:
// 新建一个策略简单工厂 class AttackStrategyFactory { public AttackStrategy create(int type) { if (type == 1) { return new WeichengdayuanStrategy(); } else { return new QianggongStrategy(); } } } public class StrategyTest { public static void main(String[] args) { AttackStrategy attackStrategy = new AttackStrategyFactory().create(1); Commander commander = new Commander(attackStrategy); commander.battle(); } }
常见应用场景:
1. 针对不同问题有不同解决办法时,可以考虑使用策略模式