Jon*_*han 4 java design-patterns
我对设计模式比较陌生,在下面的例子中,我使用的是我认为的策略模式.但是,我在一些,而不是所有的具体策略中重复自己,并想知道有没有办法避免这种情况?注意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;
}
//...
}
Run Code Online (Sandbox Code Playgroud)
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
}
}
Run Code Online (Sandbox Code Playgroud)
BCommand
public class BCommand extends PlayerCommand
{
public BCommand()
{
super("B");
}
public boolean execute(CommandSender sender, String[] args)
{
//SOMETHING ELSE
}
}
Run Code Online (Sandbox Code Playgroud)
的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
}
}
Run Code Online (Sandbox Code Playgroud)