设计模式(21):策略模式 Strategy

虽然没开发过游戏,但我敢打赌这个模式是为游戏而生的。

策略模式 Strategy

策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类,各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端。

问题:

One of the dominant strategies of object-oriented design is the “open-closed principle”.

意图:

  • Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from the clients that use it.
  • Capture the abstraction in an interface, bury implementation details in derived classes.

代码

例:比如打DOTA时,每个英雄都有4个技能,由玩家操作,玩家就相当于指令发出人,技能就相当于策略算法的实现

代码1:定义策略

/**
 * @author xdnote.com
 * 一般为抽象类或者接口,因为必须被实例化,这里需要几个默认方法所以用了抽象类
 * */
public abstract class Strategy {
    public void skill1(){
        System.out.println("被动技能1");
    };
    public void skill2(){
        System.out.println("被动技能2");
    };
    public void skill3(){
        System.out.println("被动技能3");
    };
    public void skill4(){
        System.out.println("被动技能 大招");
    };
}

代码2:策略的具体实现,小黑,龙骑

public class Xiaohei extends Strategy{
    @Override
    public void skill1() {
        System.out.println("施放 冰箭");
    }
    @Override
    public void skill2() {
        System.out.println("施放 沉默");
    }
    @Override
    public void skill3() {
        System.out.println("光环效果生效中");
    }
}
public class Longqi extends Strategy{
    @Override
    public void skill1() {
        System.out.println("施放 喷火器");
    }
    @Override
    public void skill2() {
        System.out.println("施放 控晕");
    }
    @Override
    public void skill4() {
        System.out.println("施放 变身");
    }
}

代码3:客户端调用

public static void main(String[] args){
    Strategy palyer1  = new Xiaohei();
    Strategy palyer2  = new Longqi();
    palyer1.skill1();
    palyer2.skill1();
    palyer1.skill2();
    palyer2.skill2();
    palyer1.skill3();
    palyer2.skill3();
    palyer1.skill4();
    palyer2.skill4();
}

小结

策略模式 Strategy

  • 使用频率:
    这个模式充分利用的面向的特点,平时如果定义多个实现体的话,也会可能会很自觉的写出一个标准的策略模式出来。

  • 利弊影响:
    比较容易懂。