我问question关于使用策略模式和LSP,但答案是混合的,从长远来看,这不是一个好主意。然而,我的问题底部的评论指出,虽然我没有违反LSP,但我违反了Interface Segregation Principle which states:
不应强迫客户端实现他们不实现的接口 使用。而不是一个胖接口,优选许多小接口 基于方法组,每个方法服务一个子模块。
假设我有一个像这样的武器类:
public final Weapon{
private final String name;
private final int damage;
private final List<AttackStrategy> validactions;
private final List<Actions> standardActions;
public Weapon(String name, int damage, List<AttackStrategy> standardActions, List<Actions> attacks)
{
this.name = name;
this.damage = damage;
standardActions = new ArrayList<Actions>(standardActions);
validAttacks = new ArrayList<AttackStrategy>(validActions);
}
public void standardAction(String action){} // -- Can call reload or aim here.
public int attack(String action){} // - Call any actions that are attacks.
}
接口和实施:
public interface AttackStrategy{
void attack(Enemy enemy);
}
public class Shoot implements AttackStrategy {
public void attack(Enemy enemy){
//code to shoot
}
}
public class Strike implements AttackStrategy {
public void attack(Enemy enemy){
//code to strike
}
}
使用:
List<AttackStrategy> actions = new ArrayList<AttackStrategy();
actions.add(new Shoot())
List<Actions> standardActionactions = new ArrayList<Actions>();
actions.add(new Reload(10))
Weapon rifle = new Weapon("Sniper Rifle", 5, standardActionactions, actions);
List<AttackStrategy> actions = new ArrayList<AttackStrategy();
actions.add(new Swing())
List<Actions> standardActionactions = new ArrayList<Actions>();
actions.add(new Drop())
Weapon sword = new Weapon("Standard Sword", 10, standardActionactions, actions);
我有两个武器,两者都有不同的行为,两者都可以用来攻击,两者都有针对每种类型的不同行动。例如,Sword 不应,根据我的收藏逻辑,无法调用或实施重新加载。
在我的文本冒险游戏中,如果将“reload”传递给sword.standardAction("reload")
,内部逻辑将检查List是否包含重新加载对象,如果是,则执行此操作,如果没有,武器不具备,因此不能,所以它忽略它。
我是否违反了ISP?
我的剑永远不会实现reload
,除非客户决定实施它,我不强迫客户接受Sword
知道Reload
方法他们永远不会使用。
答案 0 :(得分:0)
听起来武器抽象有点过于笼统。我会把它分解成更小的抽象
武器(抽象或界面 - 接受你的选择)
GunBasedWeapon(扩展武器)(枪支,步枪,激光枪,80年代威震天)
手持武器(扩展武器)(剑,棍棒,链等)
ThrowableWeapon(扩展武器)(飞去来器)
WeaponAction - 每个武器类现在可以有一个有效动作列表,如果某人将“applyLotion”传递给GunBasedWeapon,只有Gun类会知道它无效。