gpt4 book ai didi

java - 用于调用重写特定方法的特定类的设计模式

转载 作者:行者123 更新时间:2023-11-30 06:48:01 24 4
gpt4 key购买 nike

因此,当我尝试创建一个类时遇到了一些问题,该类可以附加具有不同功能的子类并共享一个共同的祖先,而无需真正的大层次结构树。

我想做的是创建Skill接口(interface)的n个不同的子类,这些子类在列表中分配,然后调用执行。 Skill 中的所有内容都是 Event 的子类(此处不是)。

我的问题在于 SkillManager 中,我不知道如何区分它应该调用哪个 Skill 以及创建 Skill 是否会更有效 子类化并立即执行它。

这是我的 Skill.class 界面

    public abstract class Skill
{
/**
* Private shortcut so this code doesn't have to be reused over and over to call
* for cooldowns on the skills
* @param dp player making the request
* @return if the command is available for use
*/
protected boolean canUse(DPlayer dp){
String name = "skill_"+getName();
if(!dp.getTag(name).isPresent())
return false;
if(dp.getTag(name).get().getRemaining() > 0) {
dp.sendActionBarCooldown(ChatColor.AQUA + getName(), dp.getTag(name).get().getRemaining());
return false;
}
return true;
}
/**
* Returns the name of this skills, this should also be the same
* name of the class implementing this interface for initialization
* propouses
* @return name of skills
*/
public abstract String getName();

/**
* Executor to be implemented and replace/add functionality
*/
public abstract void execute();
}

这是我的 SkillManager.class

    public class SkillManager
{
private static final SkillManager instance = new SkillManager();
private final List<Skill> SKILLS =new ArrayList<>();

private SkillManager(){}

public static SkillManager get(){return instance;}
public void registerSkill(Skill s){
SKILLS.add(s);
}
public void registerSkills(Skill... s){
for(Skill skill : s){
SKILLS.add(skill);
}
}
public void unregisterSkill(String name){
for(Skill skill : SKILLS){
if(skill.getName().equalsIgnoreCase(name)){
SKILLS.remove(skill);
}
}
}
public void callEvent(Skill skill) {
skill.execute();
}

}

这是 Sneak.class 的示例实现

public class Sneak extends Skill {

@Override
public String getName() {
return "Sneak";
}

@Override
public void onSneak(DPlayer dp, PlayerToggleSneakEvent event){
if(dp.getTag("skills_sneak").isPresent()){
//DO STUFF
}
}
}

感谢您的帮助。编辑:Event 对象源自 api 调用,而不是源 self 的实现,并且包含有关所述事件的数据编辑2:添加流程图。红色是我编码的部分。蓝色是我正在使用的结构的一部分 Flow Diagram

最佳答案

您的 OOP 代码中有两个主要问题:

  • 您的 callEvent 并不依赖于所有事件实现的唯一抽象方法,这迫使您检查对象类型以调用正确的方法。
  • 您将事件实例的强制转换作为参数发送给自身,从而在调用方中创建与所有事件类型无用的依赖关系。

使用命令设计模式;无需使用 onSneak()onBreak() 等,只需使用常见的 execute() 方法即可。在您的Skill.class 中,将execute 声明为抽象方法,迫使您在所有扩展中编写其实现。它将用于触发事件。 callEvent() 现在只需要一行代码:event.execute(dp);

您不应将事件作为参数发送给自身,因为作为实例,它可以保存自己的属性并且已经了解自己。

PS:您在问题中称之为优化,但这并不是真正的优化。修复架构很难让你的代码变得更快。另一方面,它将使其更易于阅读、维护且更可靠。 谨防过早的代码优化。

关于java - 用于调用重写特定方法的特定类的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43335660/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com