版权声明:转载请注明出处 https://blog.csdn.net/weixin_36524613/article/details/84438841
一、模式介绍
策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。
策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。
策略模式是一种对象行为型模式。
二、模式结构
三、模式代码
1、抽象策略接口
package com.example.demo.strategy;
//策略接口
public interface Strategy {
public String doScheme(String name,String scheme);
}
2、具体策略美人计
package com.example.demo.strategy;
//美人计
public class Beauty implements Strategy{
@Override
public String doScheme(String name,String scheme) {
String all = scheme+" "+"eg:"+name;
return "美人计:" + all;
}
}
3、具体策略苦肉计
package com.example.demo.strategy;
//苦肉计
public class BitterMeat implements Strategy{
@Override
public String doScheme(String name,String scheme) {
String all = scheme+" "+"eg:"+name;
return "苦肉计:" + all;
}
}
4、具体策略空城计
package com.example.demo.strategy;
//空城计
public class EmptyCity implements Strategy{
public String doScheme(String name,String scheme) {
String all = scheme+" "+"eg:"+name;
return "空城计:" + all;
}
}
5、创建上下文
package com.example.demo.strategy;
//上下文
public class Context {
private Strategy strategy;
public Context(Strategy strategy){
this.strategy = strategy;
}
public String executeStrategy(String name,String scheme){
return strategy.doScheme(name, scheme);
}
}
6、 模拟调用各策略
package com.example.demo.strategy;
//调用策略
public class Main {
public static void main(String[] args) {
Context context = new Context(new EmptyCity());
System.out.println(context.executeStrategy("诸葛亮",
"虚而示虚的疑兵之计,是一种疑中生疑的心理战,多用于己弱而敌强的情况。"));
context = new Context(new BitterMeat());
System.out.println(context.executeStrategy("三十六计",
"自己伤害自己,以蒙骗他人,从而达到预先设计好的目标。"));
context = new Context(new Beauty());
System.out.println(context.executeStrategy("王允,貂蝉之义父",
"它是利用色情、出卖肉体的方法,以女性勾引男性对象,以男性勾引女性对象,进行间谍情报活动。"));
}
}
7、打印结果
四、使用情景
完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。
1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。
2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。
3、登录认证,现在需要登录linux、Windows、mac、认证数据库。每种认证方式可以封装一个策略。
五、优缺点
优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。
缺点: 1、客户端必须知道所有策略类,并自行决定使用哪一种策略类。2、如果算法较多,则会造成很多的策略类。
六、demo地址
https://github.com/tongyuxin1/designModel/tree/master/src/main/java/com/example/demo