私はパターンの設計に比較的慣れていません。次の例では、戦略パターンであると私が信じているものを使用しています。ただし、すべてではなく、いくつかの具体的な戦略の中で繰り返していますが、これを回避する方法はあるのでしょうか? 独自の処理を行う前に、ACommand と CCommand のコードが同じであることに注意してください。
public interface Command
{
public boolean execute(CommandSender sender, String[] args);
public String getName();
//...
}
public abstract class PlayerCommand implements Command
{
protected BukkitPlugin plugin = BukkitPlugin.getInstance();
private String name;
//...
public PlayerCommand(String name)
{
this.name = name;
}
public String getName()
{
return this.name;
}
//...
}
コマンド
public class ACommand extends PlayerCommand
{
public ACommand()
{
super("A");
}
public boolean execute(CommandSender sender, String[] args)
{
Player player = (Player) sender;
PlayerInventory inventory = player.getInventory();
ItemStack itemInHand = inventory.getItemInHand();
if(itemInHand.getType() != Material.COMPASS)
{
sender.sendMessage("You must be holding a phone to use this command");
return true;
}
int id = itemInHand.getDurability();
MobilePhoneManager phoneManager = plugin.getMobilePhoneManager();
boolean isMobilePhone = phoneManager.isMobilePhone(id);
if(!isMobilePhone)
{
sender.sendMessage("You must be holding a mobile phone to use this command");
return true;
}
//DO SOMETHING UNIQUE HERE
}
}
Bコマンド
public class BCommand extends PlayerCommand
{
public BCommand()
{
super("B");
}
public boolean execute(CommandSender sender, String[] args)
{
//SOMETHING ELSE
}
}
Cコマンド
public class CCommand extends PlayerCommand
{
public CCommand()
{
super("C");
}
public boolean execute(CommandSender sender, String[] args)
{
Player player = (Player) sender;
PlayerInventory inventory = player.getInventory();
ItemStack itemInHand = inventory.getItemInHand();
if(itemInHand.getType() != Material.COMPASS)
{
sender.sendMessage("You must be holding a phone to use this command");
return true;
}
int id = itemInHand.getDurability();
MobilePhoneManager phoneManager = plugin.getMobilePhoneManager();
boolean isMobilePhone = phoneManager.isMobilePhone(id);
if(!isMobilePhone)
{
sender.sendMessage("You must be holding a mobile phone to use this command");
return true;
}
//DO SOMETHING UNIQUE HERE
}
}