java – 使用策略模式的哪种模式可以避免混凝土策略中的重复代码
发布时间:2020-12-15 04:08:13 所属栏目:Java 来源:网络整理
导读:我对设计模式比较陌生,在下面的例子中,我使用的是我认为的策略模式.但是,我在一些,而不是所有的具体策略中重复自己,并想知道有没有办法避免这种情况?注意ACommand和CCommand在做一些独特的事情之前是如何拥有相同的代码的. public interface Command { publ
我对设计模式比较陌生,在下面的例子中,我使用的是我认为的策略模式.但是,我在一些,而不是所有的具体策略中重复自己,并想知道有没有办法避免这种情况?注意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 } } 解决方法
您可以使用
template pattern作为ACommand和CCommand之间的公共基类的基础.基类中的模板方法将保存公共代码,然后调用(abstract)方法来执行doSomethingUnique().
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |