我在类中查看类似门面的委托,例如假设你有了Equip类(带有Equip()和UnEquip()方法),然后你有一个Player类,它引用了设备
我实现Player类的方法是使用一些公共方法,如EquipItem和UnEquipItem,这些方法将任务委托给Equipment类。现在,如果玩家还有另一个类的东西,比如移动,那么我会再次在Player类上放置一些公共方法,这些方法以类似外观的方式委托给Movement类。现在,Facade模式的一个缺点是增长的接口,它处理的类或系统越多。让我们假设我知道将来玩家类会有更多的功能。
我不知道这是否是正确的方法,但我想是否有可能将设备和运动参考作为属性公开,如下所示:
Class Player
{
public Equipment equipment { get; set; }
public Movement movement { get; set; }
}
现在,我知道暴露对象的状态是不好的,但是这样你可以更好地控制类的增长接口,并且在Player类上有更多关注的方法。所以而不是:
player.Equip();
你可以做到
player.equipment.Equip();
最后,我的问题是这个场景中最好的方法是什么,或者说我弄错了什么?感谢
PS:示例来自游戏区域,但解决方案不一定适用于游戏,我只是觉得它很容易理解。
答案 0 :(得分:1)
另一种方法是开发一组可以应用于操纵状态的玩家的命令动作。虽然命令对象可以扩展对播放器的访问,但外部API会将实现细节保留为黑盒子。
举个例子:
public abstract class Action
{
public abstract void ActOn(Player player);
}
public class EquipAction : Action
{
private Item item;
public EquipCommand(Item item) {
this.item = item;
}
public void ActOn(Player player) {
player.Equipment.Add(item);
}
}
public interface IPlayer
{
void PerformAction(Action action);
}
public class EquipmentSet
{
public List<Item> Items { get; private set;}
}
public class EquipmentManager
{
public Add(Item item) {
}
public List<Item> Items { get; }
}
public class Player : IPlayer
{
public EquipmentManager manager;
public PerformAction(Action action) {
action.ActOn(this);
}
public List<Items> Equipment {
return manager.Items;
}
}
现在显然,还有很多工作要做,以使其完全有能力做你想要的,但想法是将你的公共接口限制为播放器到你想要公开的结构(例如属性,设备,status,.etc)并将所有动词委托给动作。
在幕后,播放器的实际功能可以分解为限制每个组件大小的组件。