策略模式
定义了算法簇,分别封装起来,让他们之间可以互相替换,让算法簇的变化独立于使用算法的客户。
设计原则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();
}