您的位置:首页 > 编程语言 > Java开发

Java设计模式之策略模式

2015-09-14 23:21 246 查看

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

2.设计基础
    抽象、封装、多态、继承

3.设计原则
    (1)封装变化
    (2)多用组合,少用继承
    (3)针对接口编程,不针对实现编程

4 .策略模式中有三个对象:
    (1)环境对象:该类中实现了对抽象策略中定义的接口或者抽象类的引用。
    (2)抽象策略对象:它可由接口或抽象类来实现。
    (3)具体策略对象:它封装了实现同不功能的不同算法。
利用策略模式构建应用程序,可以根据用户配置等内容,选择不同有算法来实现应用程序的功能。具体的选择有环境对象来完成。采用这种方式可以避免由于使用条件语句而带来的代码混乱,提高应用程序的灵活性与条理性。

5.应用场景举例
有一个动作冒险游戏,不同的游戏角色可以使用不同的武器行为,每次角色一次只能使用一种武器,但是可以在游戏的过程中换武器。



 

 游戏角色:抽象类

 

package com.hotax.design.strategy;

/**
* Created by chaovi on 2015/9/14.
* 环境对象,引用策略接口
*/
public abstract class Character {
protected WeaponBehavior weapon;
public abstract void fight();

public void setWeapon(WeaponBehavior weapon) {
this.weapon = weapon;
}
}

 具体的角色实现类:国王

package com.hotax.design.strategy;

/**
* Created by chaovi on 2015/9/14.
*/
public class Knight extends Character {

public Knight() {
//默认武器是宝剑
this.weapon = new SwordBehavior();
}

@Override
public void fight() {
System.out.println("国王骑上了马...");
System.out.print("国王的战斗方式:");
this.weapon.useWeapon();
}
}

  具体的角色实现类:巨魔

 

 

package com.hotax.design.strategy;

/**
* Created by chaovi on 2015/9/14.
*/
public class Troll extends Character {
public Troll() {
//默认武器是斧头
this.weapon = new AxeBehavior();
}

@Override
public void fight() {
System.out.println("巨魔奔跑...");
System.out.print("巨魔的战斗方式:");
this.weapon.useWeapon();
}
}

 策略接口,不同的武器行为都一个共同的功能:被使用

 

 

package com.hotax.design.strategy;

/**
* Created by chaovi on 2015/9/14.
* 策略接口
*/
public interface WeaponBehavior {
public void useWeapon();
}

 具体的武器接口实现类:宝剑

 

 

package com.hotax.design.strategy;

/**
* Created by chaovi on 2015/9/14.
*/
public class SwordBehavior implements WeaponBehavior {
@Override
public void useWeapon() {
System.out.println("用宝剑挥舞");
}
}

  具体的武器接口实现类:斧头

package com.hotax.design.strategy;

/**
* Created by chaovi on 2015/9/14.
*/
public class AxeBehavior implements WeaponBehavior {
@Override
public void useWeapon() {
System.out.println("用斧头砍杀");
}
}

 开始战斗了,调用者

package com.hotax.design.strategy;

import java.lang.*;

/**
* Created by chaovi on 2015/9/14.
*/
public class InvokeClient {
public static void main(String[] args) {

Character knight = new Knight();
//国王开始战斗
knight.fight();
//国王想换斧头战斗
knight.setWeapon(new AxeBehavior());
knight.fight();

Character troll= new Troll();
//巨魔开始战斗
troll.fight();
}

}

 后续如果游戏增加更多的角色,更多的武器的话,只需要角色继承Character抽象类,武器行为实现WeaponBeahavior就可以了。

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: