2013-03-12 100 views
3

我對設計模式比較陌生,在下面的例子中我使用了我認爲是策略模式的東西。但是,我在裏面重複了一些,不是全部,具體策略,想知道有沒有辦法避免這種情況?注意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; 
    } 

    //... 
} 

ACommand

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 
     } 
} 

BCommand

public class BCommand extends PlayerCommand 
     { 
      public BCommand() 
      { 
       super("B"); 
      } 

      public boolean execute(CommandSender sender, String[] args) 
      { 
       //SOMETHING ELSE 
      } 
    } 

的CCommand

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 
     } 
} 
+2

這看起來像一個命令模式。如果你看到相同的代碼行,所有的時間都將它分解成一個函數。不需要新的設計模式。 – andre 2013-03-12 20:46:33

回答

6

您可以使用template pattern作爲ACommandCCommand之間的公共基類的基礎。基類中的模板方法將保存通用代碼,然後調用(abstract)方法至doSomethingUnique()

0

安德烈在所有方面都是對的。您使用的是Command模式,你只需要調整你的界面有點包含的命令是否是目前的狀態有些瞭解它能夠執行

bool canExecute(); 
boll canExecute(args) 

你平時看不到的執行方法的返回儘管如此。

HTH,
Berryl