java设计模式-----策略模式

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

 

适用性

  1. 许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的算法。
  2. 需要使用一个算法的不同变体。例如,你可能会定义一些反映不容的空间/时间权衡的算法。当这些变体实现了一个算法的类层次时[H087],可以使用策略模式。
  3. 算法使用客户不应该知道的数据。可以使用策略模式以避免暴露复杂的、与算法相关的数据结构。
  4. 一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。

 例子:以下的例子取自一个动作冒险游戏。你将看到代表游戏角色的类和角色可以使用的武器行为的类。每个角色一次只能只用一种武器,但是可以在游戏的过程中切换武器。

1:定义武器接口及实现类

package strategy;
/**
 * 定义武器行为接口
 * @author User
 *
 */
public interface WeaponBehavior {
    public void userWeapon();//选择所使用的武器
}

package strategy;

public class BowAndArrorBehavior implements WeaponBehavior {
    /**
     * 实现用弓箭射击
     */
    public void userWeapon() {
        System.out.println("用弓箭射击");
    }

}

package strategy;

public class SwordBehavior implements WeaponBehavior {
    /**
     * 实现用宝剑攻击行为
     */
    public void userWeapon() {
        System.out.println("用宝剑攻击!!");

    }

}
package strategy;

public class KnightBehavior implements WeaponBehavior {
    /**
     * 实现用匕首刺杀的行为
     */
    public void userWeapon() {
        System.out.println("用匕首刺杀!!");
    }

}


2:定义角色

package strategy;
/**
 * 角色的抽象父类 定义抽象fight方法以及策略属性
 * @author User
 *
 */
public abstract class Character {
    protected WeaponBehavior weapon;//策略调用  武器
    public abstract void fight();
    protected String name;
    //委托给行为类
    public void performFight(){
        System.out.print(name+":");
        weapon.userWeapon();
    }
    /**
     * 改变所使用的武器
     * @param weapon
     */
    public void setWeapon(WeaponBehavior weapon) {
        this.weapon = weapon;
    }
   
}

 

package strategy;

public class King extends Character {
   
    public King(){
        this.weapon=new SwordBehavior();//用宝剑
        this.name="King";
    }
   
    @Override
    public void fight() {
        System.out.println("King fight");
    }

}

 

package strategy;

public class Queen extends Character {
   
    public Queen(){
        this.weapon=new KnightBehavior();
        this.name="queen";
    }
   
    @Override
    public void fight() {
        System.out.println("queen fight");

    }   

}


3:测试类

package strategy;

public class Test {

    /**
     * @param args
     */
    public static void main(String[] args) {
        //定义能够使用的武器
        SwordBehavior swordBehavior=new SwordBehavior();
        KnightBehavior knightBehavior=new KnightBehavior();
        BowAndArrorBehavior bowAndArrorBehavior=new BowAndArrorBehavior();
       
        //定义角色
        Character king=new King();
        Character queen=new Queen();
       
        //使用默认的武器
        System.out.println("**************使用默认武器****************");
        king.performFight();
        queen.performFight();
       
        //切换武器
        king.setWeapon(knightBehavior);
        queen.setWeapon(swordBehavior);
       
        System.out.println("**************更换武器后****************");
        king.performFight();
        queen.performFight();

    }

}


4:结果

**************使用默认武器****************
King:用宝剑攻击!!
queen:用匕首刺杀!!
**************更换武器后****************
King:用匕首刺杀!!
queen:用宝剑攻击!!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值