夜话JAVA设计模式之策略模式

策略模式
    定义了算法簇,分别封装起来,让他们之间可以互相替换,让算法簇的变化独立于使用算法的客户。
设计原则1
    找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起。
设计原则2
    针对接口编程,而不是针对实现编程。
设计原则3
    多用组合,少用继承。

下面简单的代码描述了不同的角色用武器加入战斗,同时它们也可以切换武器。

话不多说,直接撸代码


1.角色抽象类BaseCharacter

/**
 * 角色抽象类
 * @author monkjavaer
 * @date 2018/08/18 10:35
 */
public abstract class BaseCharacter {

    WeaponBehavior weaponBehavior;

    public BaseCharacter(){

    }

    /**
     * 切换武器
     * @param weaponBehavior
     */
    public void setWeaponBehavior(WeaponBehavior weaponBehavior) {
        System.out.println("set weapon");
        this.weaponBehavior = weaponBehavior;
    }

    /**
     * 用不同武器战斗
     */
    public abstract void fight();

    /**
     * 所有继承这个抽象类的都可以说hello
     */
    public void sayHello(){
        System.out.print("hello!");
    }
}

  

1.1国王继承角色

/**
 * @author monkjavaer
 * @date 2018/08/18 11:30
 */
public class King extends BaseCharacter{

    public King() {
        weaponBehavior = new KnifeBehavior();
    }

    @Override
    public void fight(){
        System.out.print("king fight:");
        weaponBehavior.useWeapon();
    }
}

  

1.2皇后类继承角色

/**
 * @author monkjavaer
 * @date 2018/08/18 11:32
 */
public class Queen extends BaseCharacter {

    public Queen() {
        weaponBehavior = new KnifeBehavior();
    }

    @Override
    public void fight() {
        System.out.print("Queen fight:");
        weaponBehavior.useWeapon();
    }
}

  

2.武器接口WeaponBehavior

/**
 * 武器接口
 * @author monkjavaer
 * @date 2018/08/18 10:38
 */
public interface WeaponBehavior {
    /**
     * 使用武器
     */
    void useWeapon();
}

  

2.1匕首类实现武器接口

/**
 * 匕首
 * @author monkjavaer
 * @date 2018/08/18 11:36
 */
public class KnifeBehavior implements WeaponBehavior {
    @Override
    public void useWeapon() {
        System.out.println("use Knife");
    }
}

  

2.2宝剑实现武器接口

/**
 * 宝剑
 * @author monkjavaer
 * @date 2018/08/18 11:35
 */
public class SwordBehavior implements WeaponBehavior {
    @Override
    public void useWeapon() {
        System.out.println("use Sword");
    }
}

  

测试类

public static void main(String[] args) {

    BaseCharacter king = new King();
    king.sayHello();
    king.fight();
    king.setWeaponBehavior(new SwordBehavior());
    king.fight();

    BaseCharacter queen = new Queen();
    queen.fight();
}

  

原文地址:https://www.cnblogs.com/monkjavaer/p/9569262.html