设计模式学习笔记_策略模式

定义

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

结构

策略模式UML类图

在策略模式中,涉及到以下三个角色:

1、环境角色(Context):持有一个抽象策略角色(Strategy)的引用

2、抽象策略角色(Strategy):一个抽象角色,通常是由一个接口或者抽象类来实现,作用为为具体策略角色(ConcreteStrategy)提供所需的接口

3、具体策略角色(ConcreteStrategy):包装了相关的算法或行为的具体实现

典型代码

抽象策略类(Strategy):

public interface Strategy{
    //策略方法
    public void StrategyInterface();
}

具体策略类(ConcreteStrategy):

public class ConcreteStrategyA implements Strategy{
    @Override
    public void strategyInterface(){
        //A算法或行为的具体实现
    }
}

public class ConcreteStrategyB implements Strategy{
    @Override
    public void strategyInterface(){
        //B算法或行为的具体实现
    }
}

...

public class ConcreteStrategyZ implements Strategy{
    @Override
    public void strategyInterface(){
        //Z算法或行为的具体实现
    }
}

环境角色类(Context):

public class Context{
    //持有一个具体策略类的对象,在使用时传入一个具体策略类对象并将其赋值于strategy
    private Strategy strategy;
    
    //策略方法
    public void contextInterface(){
        strategy.strategyInterface();
    }
}

举个栗子

作为我们寝室枪神,我决定以吃鸡游戏为例0v0
绝地求生中有防弹衣这种装备,能够按照一定比例减免受到的伤害

public interface Armor{
    public void damageCalculation(int damage){
    }
}

然后呢,防弹衣又分为三个等级,以及坦诚相见

public class ArmorNull implements Armor{
    @Override
    public void damageCalculation(int damage){
        return damage;
    }
}

public class ArmorLevel1 implements Armor{
    @Override
    public void damageCalculation(int damage){
        return damage * 0.7;
    }
}

public class ArmorLevel2 implements Armor{
    @Override
    public void damageCalculation(int damage){
        return damage * 0.6;
    }
}

public class ArmorLevel3 implements Armor{
    //有排面
    @Override
    public void damageCalculation(int damage){
        return damage * 0.45;
    }
}

这是我自己:

public class HandsomeMan{
    private Armor armor = new Armor_null();
    public void setArmor(Armor armor){
        this.armor = armor;
    }
    public void calculate(int damage){
        armor.damageCalculation(damage);
    }
}

进入游戏

public HandsomeMan me = new HandsomeMan();
//被556打了一枪。。
damage = me.calculate(43);//43
//反手捡了件三级甲
me.setArmor(new ArmorLevel3());
damage = me.calculate(43);//43*0.45

总结

策略模式还是比较容易理解的,平常也都这么用了,看了书发现这也是设计模式。。
优点:提供了管理算法族的方法,合理使用继承避免了代码重复;避免了出现一万个if-else的情况
缺点:客户端必须知道所有的策略类以便在合适的时候选择合适的策略类;如果策略非常多的话策略类的数量也随之增加
防弹衣很重要

你可能感兴趣的:(设计模式学习笔记_策略模式)