设计模式——策略模式(Strategy)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34261214/article/details/82941668

关于策略模式

策略模式定义了算法族,分别封装起来,让它们之间可以互相调用,让算法的变化独立于使用算法的客户。

这个模式涉及到三个角色:
  ●  环境(Context)角色:持有一个Strategy的引用。
  ●  抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
  ●  具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。

大话策略模式

最近国庆放假,一直在和同学在王者峡谷玩耍,玩过王者荣耀的应该都知道,每个英雄可以带一个召唤师技能。我们用策略模式来解释就是:英雄对应环境角色(Context),召唤师技能对应抽象策略角色(Strategy),那么具体策略角色就是对应召唤师技能的作用,如闪现,治疗,惩戒等

  • 环境角色: 英雄
public class Hero {
    //持有一个召唤师技能的对象
    private Technique technique;
    /**
     * 构造函数,传入一个具体策略对象
     * @param technique 指定的召唤师技能
     */
    public Hero(Technique technique){
        this.technique= technique;
    }
    /**
     * 使用召唤师技能
     */
    public void useTechnique(){   
        technique.myTechnique();
    }
}
  • 抽象策略:召唤师技能
//召唤师技能是一个接口,所有的具体技能都实现该接口
public interface Technique {
    /**
     * 策略方法
     * 技能
     */
    public void myTechnique();
}
  • 具体策略:闪现,治疗,惩戒
//闪现
public class Flash implements Technique{
    @Override
    public void myTechnique() {
        //使用召唤师技能
        System.out.println("我要闪现了");
    }
}
//治疗
public class Treatment implements Technique{
    @Override
    public void myTechnique() {
        //使用召唤师技能
        System.out.println("我要使用治疗了");
    }
}
  • 具体使用场景:
    如:当小亮挑选的英雄选择闪现作为召唤师技能时
	//小亮选了个鲁班,带的技能是闪现
	Hero luban = new Hero(new Flash());
	//使用技能
	luban.useTechnique();

最后代码输出我要闪现了

策略模式解析

由上面例子可以知道,每个英雄携带的召唤师技能不是固定的,而是动态分配的。也就是说具体策略并不是和环境角色一一对应的,而情况而改变。这就是对算法的封装,针对不同的用户采取不同的策略。

资料

[1]《JAVA与模式》之策略模式
[1] HeadFirst 设计模式

猜你喜欢

转载自blog.csdn.net/qq_34261214/article/details/82941668