2013-03-12 104 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