所以我在嘗試創建一個類時可能會附加具有不同功能的子類並共享一個共同的祖先而沒有真正的大型層次樹。用於調用特定類的設計模式覆蓋特定的方法
我想要做的是n
Skill
接口的不同子類,它們被分配在一個列表中,然後調用執行。所有在Skill
是Event
(不在這裏)的子類。
我的問題在於SkillManager
在這裏我就不如何區分哪些Skill
應該打電話wheter這將是更大的影響只是創造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調用 編輯2:添加流程圖。紅色是我編碼的部分。藍色是結構的一部分,我使用
與您的問題沒有直接關係,但在您的示例中,沒有必要使'List SKILLS'成爲靜態成員。 –
謝謝@ChristopheWeis我完全錯過了 – MartinStone