前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在王者荣耀角度下分析面向对象程序设计B中23种设计模式之策略模式

在王者荣耀角度下分析面向对象程序设计B中23种设计模式之策略模式

原创
作者头像
荣仔_最靓的仔
修改2021-02-01 11:03:38
2930
修改2021-02-01 11:03:38
举报
文章被收录于专栏:一些有趣的Python案例

·

策略模式在王者荣耀中的应用

·

应用一:【登录游戏前】选择通过何种方式登录游戏

应用二:【游戏开始前】选择英雄及其召唤师技能

应用三:【游戏开始后】选择使用普攻还是技能

一、简述

登录游戏前,玩家面临选择以QQ账号登录还是微信账号登录的问题,进一步来说,玩家还面临着去哪一个区玩的问题;玩家开始游戏前,面临着配合阵容选英雄及其召唤师技能的问题;进入游戏后,玩家会面临根据战况选择使用一二三技能还是普攻,以及是否使用召唤师技能等问题。 完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。 在上述3个实例中:

①登录游戏前 为了完成登录游戏任务,可以选择QQ还是微信等多种方式; ②游戏开始前 为了满足阵容科学任务,可以选择相适应的英雄及其召唤师技能等多种组合方式; ③游戏开始后 为了取得团战胜利任务,可以选择使用普攻还是哪种技能等多种技能搭配方式。

下面着重对应用二(游戏开始前)实例做详细介绍……

二、策略模式(Strategy Pattern)

策略模式理解: 高度概括:定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法独立于使用它的客户而变化。 通常我们可以用策略模式解决此类问题:由于用户需求的变化,导致经常需要修改类中的某个方法的方法体(需要不断地变换算法),为了避免这种痛苦的修改代码,我们就可以通过接口或抽象类封装算法的标识(在接口中定义一个抽象方法),实现该接口的类将实现接口中的抽象方法。策略模式把针对一个算法标识的一系列具体算法分别封装在不同类中,使得各个类给出的具体算法可以相互替换。

策略模式结构中的三种角色: ·策略(Strategy):是一个接口,定义若干个算法标识(抽象方法); ·具体策略(ConcreteStrategy):是实现策略接口的类,给出算法标识的具体算法; ·上下文(Context):是依赖于策略接口的类(包含策略声明的变量),上下文提供一个方法,该方法委托策略变量调用具体策略实现策略接口中的方法。

策略模式的UML类图:

策略模式的优缺点: 优点: ①上下文和具体策略是松耦合关系; ②满足“开—闭原则”; ③架构灵活; 缺点: 增加了对象的数目,致使对象数目增多

三、王者荣耀角度下实现策略模式结构图及代码

实现此策略模式的UML类图

eclipse结构图

主函数【应用(Application)】 Application.java

代码语言:javascript
复制
package angle_strategy;

import angle_strategy.QualifyingCompetition;
import angle_strategy.Hero;
import angle_strategy.StaregyDiaochanJinghua;
import angle_strategy.StaregyHouyiKuangbao;
import angle_strategy.StaregyLibaiChengji;
import angle_strategy.StaregyMachaoJipao;
import angle_strategy.StaregyMingshiyinZhiliao;

public class Application {

	public static void main(String[] args) {
		QualifyingCompetition game=new QualifyingCompetition();     //上下文对象
		Hero diaochan=new Hero();
		diaochan.setName("貂蝉");         //貂蝉净化
        diaochan.setSkill("净化");
        diaochan.setDialogue("无尽的舞蹈何日方休");
        Hero houyi=new Hero();
		houyi.setName("后羿");         //后羿狂暴
        houyi.setSkill("狂暴");
        houyi.setDialogue("周日被我射熄火了,所以今天是周一");
        Hero libai=new Hero();
		libai.setName("李白");         //李白惩击
        libai.setSkill("惩击");
        libai.setDialogue("凤兮凤兮归故乡,遨游四海求其凰");
        Hero machao=new Hero();
		machao.setName("马超");         //马超疾跑
        machao.setSkill("疾跑");
        machao.setDialogue("我的枪去而复返,你的生命有去无回");
        Hero mingshiyin=new Hero();
		mingshiyin.setName("明世隐");         //明世隐治疗
        mingshiyin.setSkill("治疗");
        mingshiyin.setDialogue("血管里,流淌着忘川之水");
        System.out.println("");
        System.out.println("我打哪个位置都可以,你们先选,我补位!");
        System.out.println("-----------------------------------------------");
		game.setStrategy(new StaregyDiaochanJinghua());        //上下文对象使用策略一
		System.out.println("当最后剩余【法师】位时:");
		System.out.printf("我选择【%s】,我带的召唤师技能是【%s】\n",diaochan.getName(),diaochan.getSkill());
		System.out.printf("选择后触发英雄台词:%s\n",diaochan.getDialogue());
		System.out.println("-----------------------------------------------");
		game.setStrategy(new StaregyHouyiKuangbao());    //上下文对象使用策略二
		System.out.println("当最后剩余【射手】位时:");
		System.out.printf("我选择【%s】,我带的召唤师技能是【%s】\n",houyi.getName(),houyi.getSkill());
		System.out.printf("选择后触发英雄台词:%s\n",houyi.getDialogue());
		System.out.println("-----------------------------------------------");
		game.setStrategy(new StaregyLibaiChengji());    //上下文对象使用策略三
		System.out.println("当最后剩余【打野】位时:");
		System.out.printf("我选择【%s】,我带的召唤师技能是【%s】\n",libai.getName(),libai.getSkill());
		System.out.printf("选择后触发英雄台词:%s\n",libai.getDialogue());
		System.out.println("-----------------------------------------------");
		game.setStrategy(new StaregyMachaoJipao());    //上下文对象使用策略四
		System.out.println("当最后剩余【战士/坦克】位时:");
		System.out.printf("我选择【%s】,我带的召唤师技能是【%s】\n",machao.getName(),machao.getSkill());
		System.out.printf("选择后触发英雄台词:%s\n",machao.getDialogue());
		System.out.println("-----------------------------------------------");
		game.setStrategy(new StaregyMingshiyinZhiliao());    //上下文对象使用策略五
		System.out.println("当最后剩余【辅助】位时:");
		System.out.printf("我选择【%s】,我带的召唤师技能是【%s】\n",mingshiyin.getName(),mingshiyin.getSkill());
		System.out.printf("选择后触发英雄台词:%s\n",mingshiyin.getDialogue());
	    }

	}
	
	class Hero{
		String name,skill,dialogue;
		public void setName(String s){
			name=s;
		}
		public void setSkill(String t){
			skill=t;
		}
		public void setDialogue(String v){
			dialogue=v;
		}
		public String getDialogue(){
			return dialogue;
		}
		public String getName(){
			return name;
		}
		public String getSkill(){
			return skill;
		}
	}

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687

策略(Strategy) ChoosesStaregy.java

代码语言:javascript
复制
package angle_strategy;

/*
         角色1:策略 
*/

public interface ChoosesStaregy {
	public abstract String whichChooses(String a);   

}
12345678910

具体策略(ConcreteStrategy) StaregyDiaochanJinghua.java

代码语言:javascript
复制
package angle_strategy;
/*
           角色2.1:具体策略 (缺法师,补位貂蝉,召唤师技能带净化)
*/
public class StaregyDiaochanJinghua implements ChoosesStaregy {
	public String whichChooses(String a){
		return a;
	}
}

12345678910

StaregyHouyiKuangbao.java

代码语言:javascript
复制
package angle_strategy;
/*
           角色2.2:具体策略 (缺射手,补位后羿,召唤师技能带狂暴)
*/
public class StaregyHouyiKuangbao implements ChoosesStaregy {
	public String whichChooses(String a){
		return a;
	}

}

1234567891011

StaregyLibaiChengji.java

代码语言:javascript
复制
package angle_strategy;
/*
           角色2.3:具体策略 (缺打野,补位李白,召唤师技能带惩击)
*/
public class StaregyLibaiChengji implements ChoosesStaregy {
	public String whichChooses(String a){
		return a;
	}
}

12345678910

StaregyMachaoJipao,java

代码语言:javascript
复制
package angle_strategy;
/*
           角色2.4:具体策略 (缺边路,补位马超,召唤师技能带疾跑)
*/
public class StaregyMachaoJipao implements ChoosesStaregy {
	public String whichChooses(String a){
		return a;
	}
}

12345678910

StaregyMingshiyinZhiliao,java

代码语言:javascript
复制
package angle_strategy;
/*
          角色2.5:具体策略(缺辅助,补位明世隐,召唤师技能带治疗) 
*/
public class StaregyMingshiyinZhiliao implements ChoosesStaregy {
	public String whichChooses(String a){
		return a;
	}
}

12345678910

上下文(Context) QualifyingCompetition.java

代码语言:javascript
复制
package angle_strategy;

/*
         角色3:上下文 (排位比赛)
*/

import angle_strategy.ChoosesStaregy;

public class QualifyingCompetition {
	ChoosesStaregy strategy;
	public void setStrategy(ChoosesStaregy strategy){
		this.strategy=strategy;
	}
	public String getPlayerChooses(String a){
		if(strategy!=null)
			return strategy.whichChooses(a);
		else
			return null;
	}

}

12345678910111213141516171819202122

运行结果截图

更多设计模式在王者荣耀中的应用请点击我的→设计模式在王者荣耀中的应用专栏

欢迎留言,一起交流学习

感谢阅读

END

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ·
  • 策略模式在王者荣耀中的应用
  • ·
  • 一、简述
  • 二、策略模式(Strategy Pattern)
  • 三、王者荣耀角度下实现策略模式结构图及代码
  • 欢迎留言,一起交流学习
  • END
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档