我正在开发一款可定制船只的太空射击游戏。您可以通过一对雷达图表*增加船舶任意数量的物体的强度。在内部,我将每艘船代表为子类SpaceObject
类,其中包含描述该船的各种属性的ShipInfo
。
我想开发一个相对简单的API,它允许我为所有船舶属性(其中一些是基础实际集合的简化)提供相对强度的块(从雷达图允许的最小值到最大值)属性)并获取一个ShipInfo类,我可以给一个PlayerShip
类(即实例化为玩家船的对象)。
我可以自己开发代码来进行简化和实际属性之间的转换,但是我想提供一些建议来提供哪种架构来最小化与这个转换器代码交互的痛苦(即没有5+的方法)争论或其他一些废话)。有没有人有任何想法?
* =尚未实际实施,但这是计划。
答案 0 :(得分:5)
我会说Facade模式非常适合这种问题。如果您的方法有5个以上的参数,请考虑将它们中的至少一部分封装在一个新类型中。
答案 1 :(得分:5)
Builder模式怎么样?您可以在ShipInfo类上使用静态FillDefaults
方法,然后通过实例方法分配ShipInfo的每个属性,该方法返回您正在使用的实例,如下所示:
ShipInfo.FillDefaults().CalculateSomething(50).AssignName("Testing...").RelativeFiringPower(10).ApplyTo(myShip);
在ShipInfo中,这看起来像是:
public static ShipInfo FillDefaults()
{
ShipInfo newInstance = ...;
// Do some default setup here
return newInstance;
}
public ShipInfo CalculateSomething(int basis)
{
// Do some calculation
// Assign some values internally
return this;
}
// Keep following this pattern of methods
public void ApplyTo(SpaceObject obj)
{
// Some checks here if you want
obj.ShipInfo = this;
}
答案 2 :(得分:1)
好像你想要设置一些属性而不是其他属性,但不是按特定的重要顺序设置,这样你就可以用渐进的更多参数定义重载。
您可以实现一个构造函数,该构造函数具有为另一个设置默认值所需的最小值,然后使用object initializer设置剩余的相关值:
// Didn't set properties 2 3 and 6, only set the ones needed in this case.
SpaceObject ship = new SpaceObject(someRequiredValue) {
Property1 = 50,
Property4 = Game.Settings.Ships.Armor.Strong,
Property5 = new PropertySet1{
Prop51 = "Enterprise",
Prop53 = true,
Prop57 = false
};
答案 3 :(得分:0)
对我而言,这似乎是decorator pattern的一个案例。