策略模式和工厂模式很相似,但是确实有不同的地方,从我的理解看工厂模式一切都是封装好的,只能调用,策略模式更倾向通过当前状况去创建不同的类处理
策略模式一种行为模式
首先需要一个接口和工厂模式一样,举个例子刘备去江东,诸葛亮给力三个精囊妙计,
package com.jvm.策略模式;
public interface 策略模式 {
void handler(String name);
}
package com.jvm.策略模式;
public class 锦囊1 implements 策略模式 {
@Override
public void handler(String name) {
System.out.println(name + "诸葛亮给刘备的锦囊1 上去揍他");
}
}
package com.jvm.策略模式;
public class 锦囊2 implements 策略模式{
@Override
public void handler(String name) {
System.out.println(name + "诸葛亮给刘备的锦囊2 骂死他");;
}
}
package com.jvm.策略模式;
public class 锦囊3 implements 策略模式 {
@Override
public void handler(String name) {
System.out.println(name + "诸葛亮给刘备的锦囊3 跑路");
}
}
有三个精囊妙计,根据不同的环境使用不同的妙计,这就是与工厂模式不同的地方,工厂模式在使用的时候已经new出了对象,然后调用,策略模式是通过不同的环境我新new一个对象来处理,把策略当做参数传进去,得到不同的结果
package com.jvm.策略模式;
public class 环境 {
private 策略模式 celue;
public 环境(策略模式 celue) {
this.celue = celue;
}
public void 根据环境处理(String name) {
this.celue.handler(name);
}
}
我们看如何调用
package com.jvm.策略模式;
public class 主类 {
public static void main(String[] args) {
环境 aa=new 环境(new 锦囊1());
aa.根据环境处理("甩杯了");
环境 bb=new 环境(new 锦囊2());
bb.根据环境处理("骂你了");
环境 cc=new 环境(new 锦囊3());
cc.根据环境处理("拿刀来了");
}
}
得到结果
甩杯了诸葛亮给刘备的锦囊1 上去揍他
骂你了诸葛亮给刘备的锦囊2 骂死他
拿刀来了诸葛亮给刘备的锦囊3 跑路