概念:用于算法的自由切换和扩展,需要使用策略模式实现算法的定义和使用分离,从而替换传统的硬编码方式。又称政策模式。
角色包括:
环境类:使用算法的角色,维护抽象策略类的引用。
抽象策略类:声明抽象算法,方便替换算法。
具体策略类:实现抽象策略类。
实现大致过程
定义一个策略公有方法接口A,所有不同种类的策略实现这个接口A。再定义一个环境类,包含接口A这个成员变量,定义一个方法,用来执行传入成员变量的方法。
所有策略公有方法类
package com.example.ployDemo;
/**
* description
* <p>
* 所有策略共有方法类
* @author slliao
* @date 2019/4/29 10:06.
*/
public interface Gun {
public void run();
}
策略1实现公有方法接口
package com.example.ployDemo;
/**
* description
* <p>
* Awm实现Gun接口
* @author slliao
* @date 2019/4/29 10:07.
*/
public class AwmGun implements Gun{
@Override
public void run() {
System.out.println("正在使用AWM");
}
}
策略2实现共有方法接口
package com.example.ployDemo;
/**
* description
* <p>
*散弹枪实现gun接口
* @author slliao
* @date 2019/4/29 10:08.
*/
public class ShotGun implements Gun{
@Override
public void run() {
System.out.println("正在使用散弹枪");
}
}
定义环境类
package com.example.ployDemo;
/**
* description
* <p>
* 定义一个枪的接口
* @author slliao
* @date 2019/4/29 10:10.
*/
public class Environment {
private Gun gun;
public Environment(Gun gun){
super();
this.gun=gun;
}
public void run(){
gun.run();
}
public Gun getGun() {
return gun;
}
public void setGun(Gun gun) {
this.gun = gun;
}
}
测试
public class Test {
public static void main(String[] args) {
System.out.println("距离远,使用远程武器");
Environment en = new Environment(new AwmGun());
en.run();
System.out.println("距离近,使用近战武器");
en.setGun(new ShotGun());
en.run();
}
}
总结
优点:可以根据不同情况动态的改变对象的行为。
缺点:情况复杂的情况下需要建立很多的策略类。
客户端需要知道全部的策略,并且自己决定使用哪种策略。