策略模式(Strategy Pattern):
定义了算法族,分别封装起来,让它们之间可相互替换,此模式让算法的变化独立于使用算法的客户。
和工厂模式最大的区别是工厂模式客户不需要关心对象创建的过程而策略模式需要用户自己去决定对象创建工程的步骤
举个例子:
我们去吃饭,工厂模式就好比,我们只需要决定我们是吃中餐还是西餐即可,而策略模式就好比,我们自己决定是吃中餐就需要做一盘川菜或者粤菜,需要吃什么菜我们就选择做什么菜即可得到一顿中餐
实际例子:
Igongfa 功法接口
public interface Igongfa {
public void attack();
}
Gongfa_hanbing 功法寒冰掌
public class Gongfa_hanbing implements Igongfa{
@Override
public void attack() {
System.out.println("使用寒冰掌攻击");
}
}
Gongfa_jiuyang 九阳神功
public class Gongfa_jiuyang implements Igongfa{
@Override
public void attack() {
System.out.println("使用九阳神功攻击");
}
}
Istyle人物外观风格接口
public interface Istyle {
public void style();
}
Style_man 男性风格外观
public class Style_man implements Istyle{
@Override
public void style() {
System.out.println("性别:男");
}
}
Style_women 女性风格外观
public class Style_women implements Istyle{
@Override
public void style() {
System.out.println("性别:女");
}
}
Role 角色
public class Role {
private Igongfa gongfa;
private Istyle style;
public Igongfa getGongfa() {
return gongfa;
}
public void setGongfa(Igongfa gongfa) {
this.gongfa = gongfa;
}
public Istyle getStyle() {
return style;
}
public void setStyle(Istyle style) {
this.style = style;
}
public void attack(){
this.getGongfa().attack();
}
public void style(){
this.getStyle().style();
}
}
test类
public class Test {
public static void main(String[] args) {
Role r =new Role();
r.setGongfa(new Gongfa_hanbing());
r.setStyle(new Style_women());
r.attack();
r.style();
}
}
执行结果:
使用寒冰掌攻击
性别:女
1、封装变化(把可能变化的代码封装起来)
2、多用组合,少用继承(我们使用组合的方式,为客户设置了算法)
3、针对接口编程,不针对实现(对于Role类的设计完全的针对角色,和技能的实现没有关系)