策略模式
概述
简单理解
比如:在我的世界中 有两个物品 1.铁 2.木棍
铁和木棍可以合成多种物品 (如:铁镐,铁斧,铁剑…)
用户可以根据需求来选择自己所需要的物品 这就是策略模式
主要解决
在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。
何时使用
一个系统有许多许多类,而区分它们的只是他们直接的行为。
使用场景
1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
2、一个系统需要动态地在几种算法中选择一种。
3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现
注意:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。
代码
接口
//合成的物品类 需要同一个接口
public interface Items {
String getItems(String s1,String s2);
}
物品类
public class LronJian implements Items{
public String getItems(String s1, String s2) {
System.out.println(s1+"+"+s2+": 铁剑");
return "铁剑";
}
}
public class Pickmattock implements Items{
public String getItems(String s1, String s2) {
System.out.println(s1+"+"+s2+": 铁镐");
return "铁镐";
}
}
context
public class Context {
private Items items;
//根据传入的物品类 来创建
public Context(Items item){
this.items = item;
}
public String executeItems(String s1, String s2){
return items.getItems(s1, s2);
}
}
测试类
public class Demo {
public static void main(String[] args) {
//告诉Context类 需要合成的物品的 类
Context context = new Context(new LronJian());
context.executeItems("铁","木棍");
//告诉Context类 需要合成的物品的 类
Context context2 = new Context(new Pickmattock());
context2.executeItems("铁","木棍");
}
}
//测试结果
铁+木棍: 铁剑
铁+木棍: 铁镐