4

私はパターンの設計に比較的慣れていません。次の例では、戦略パターンであると私が信じているものを使用しています。ただし、すべてではなく、いくつかの具体的な戦略の中で繰り返していますが、これを回避する方法はあるのでしょうか? 独自の処理を行う前に、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
        }
}
4

2 に答える 2

7

との間の共通の基本クラスの基礎として、テンプレート パターンを使用できます。基本クラスのテンプレート メソッドは、共通コードを保持し、( ) メソッドを呼び出します。ACommandCCommandabstractdoSomethingUnique()

于 2013-03-12T20:47:09.680 に答える
0

アンドレはすべての点で正しいです。コマンドパターンを使用していて、インターフェイスを少し調整して、コマンドが現在実行可能な状態にあるかどうかの概念を含める必要があります。

bool canExecute();
boll canExecute(args)

ただし、通常、executeメソッドが何も返さないことはありません。

HTH、
ベリール

于 2013-03-13T05:13:14.300 に答える