java设计模式之策略模式

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

客户。

假设我们在此之前,不知道设计模式,我们要写一个角色打怪的游戏。首先,每个角色对应一个名字,

每类角色对应一中样子,以及一个逃跑方式和攻击、防御的技能。

如果不使用设计模式来进行设计的话,就会是这样:

 
    package com.zhy.bean;  
      
    /** 
     * 游戏的角色超类 
     *  
     * @author zhy 
     *  
     */  
    public abstract class Role  
    {  
        protected String name;  
      
        protected abstract void display();  
      
        protected abstract void run();  
      
        protected abstract void attack();  
      
        protected abstract void defend();  
      
    }  
    package com.zhy.bean;  
      
    public class RoleA extends Role  
    {  
        public RoleA(String name)  
        {  
            this.name = name;  
        }  
      
        @Override  
        protected void display()  
        {  
            System.out.println("样子1");  
        }  
      
        @Override  
        protected void run()  
        {  
            System.out.println("金蝉脱壳");  
        }  
      
        @Override  
        protected void attack()  
        {  
            System.out.println("降龙十八掌");  
        }  
      
        @Override  
        protected void defend()  
        {  
            System.out.println("铁头功");  
        }  
      
    }  

这样子看上去是没问题,可是,如果为了游戏的可玩度,当需要新增游戏角色时,则又需要添加一样的类

,这样子就让代码显得杂糅,增加了工作量不说,重点是没有b格啊!所以,这个时候,我们就需要

采用设计模式来进行代码的重构了。

首先,定义好不同的行为:

package celuemoshi;

//攻击行为
public interface IAttackBehavior {
	void attack();
}
package celuemoshi;

//防御行为
public interface IDefendBehavior {
	void defend();
}
package celuemoshi;

//样子
public interface IDisplayBehavior {
	void display();
}
package celuemoshi;

//逃跑行为
public interface IRunBehavior {
	void run();
}

然后定义角色的超类:

package celuemoshi;

public abstract class Role {
	protected String name;  
	  
    protected IDefendBehavior defendBehavior;  
    protected IDisplayBehavior displayBehavior;  
    protected IRunBehavior runBehavior;  
    protected IAttackBehavior attackBehavior;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public IDefendBehavior getDefendBehavior() {
		return defendBehavior;
	}
	public void setDefendBehavior(IDefendBehavior defendBehavior) {
		this.defendBehavior = defendBehavior;
	}
	public IDisplayBehavior getDisplayBehavior() {
		return displayBehavior;
	}
	public void setDisplayBehavior(IDisplayBehavior displayBehavior) {
		this.displayBehavior = displayBehavior;
	}
	public IRunBehavior getRunBehavior() {
		return runBehavior;
	}
	public void setRunBehavior(IRunBehavior runBehavior) {
		this.runBehavior = runBehavior;
	}
	public IAttackBehavior getAttackBehavior() {
		return attackBehavior;
	}
	public void setAttackBehavior(IAttackBehavior attackBehavior) {
		this.attackBehavior = attackBehavior;
	}

之后就要创建某个角色了:

package celuemoshi;

public class AttackJY implements IAttackBehavior {

	@Override
	public void attack() {
		// TODO Auto-generated method stub
		System.out.println("仙法*超大玉螺旋丸");
	}

}
package celuemoshi;

public class DefendTBS implements IDefendBehavior {

	@Override
	public void defend() {
		// TODO Auto-generated method stub
		System.out.println("水遁*替身术");
	}

}
package celuemoshi;

public class DisplayA implements IDisplayBehavior {

	@Override
	public void display() {
		// TODO Auto-generated method stub
		System.out.println("木叶忍者村忍者");
	}

}
package celuemoshi;

public class RunJCTQ implements IRunBehavior {

	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println("瞬间移动");
	}

}
package celuemoshi;

public class RoleA extends Role{
	public RoleA(String name) {
		this.name = name;
	}
}

最后,写一个测试类来调用它:

package celuemoshi;

public class Test {
	public static void main(String[] args) {
		Role roleaA = new RoleA("A");
		//roleaA.setAttackBehavior(new AttackJY()).setDefendBehavior(new DefendTBS()).setRunBehavior(new RunJCTQ()).setDisplayBehavior(new DisplayA());
		roleaA.setAttackBehavior(new AttackJY());
		roleaA.setDefendBehavior(new DefendTBS());
		roleaA.setRunBehavior(new RunJCTQ());
		roleaA.setDisplayBehavior(new DisplayA());
		System.out.println(roleaA.name+":");
		roleaA.getRunBehavior().run();
		roleaA.getAttackBehavior().attack();
		roleaA.getDefendBehavior().defend();
		roleaA.getDisplayBehavior().display();
	}
}
最终结果为:
A:
瞬间移动
仙法*超大玉螺旋丸
水遁*替身术
木叶忍者村忍者
这样就创建好了一个角色了,如果你想再创建其他新角色的话,按照这种方式增加就ok了,这样,策略模式就算是完成了。








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值