委托与暴露属性

Delegation vs exposing properties

我在 classes 中查看类似外观的委托,例如,假设您获得了设备 class(使用 Equip() 和 UnEquip() 方法),然后您有一个玩家 class 引用了设备。

我实现播放器 class 的方法是使用一些 public 方法,例如 EquipItem 和 UnEquipItem,这些方法会将任务委托给设备 class。现在,如果玩家还有另一个 class 做一些事情,比如移动,那么我会再次在玩家 class 上放置一些 public 方法,委托给移动 class,以类似门面的方式。现在外观模式的缺点之一是它处理的 classes 或系统越多,接口就越多。假设我知道在未来,播放器 class 将具有更多功能。

我不知道这是否是正确的方法,但我在考虑是否可以将设备和移动引用公开为属性,如下所示:

Class Player
{
     public Equipment equipment { get; set; }
     public Movement movement { get; set; }
}    

现在,我知道公开对象的状态是不好的,但这样您就可以更好地控制 class 不断增长的界面,并且可以将更多的方法集中在 Player class .所以代替:

player.Equip();

你可以做到

player.equipment.Equip();

最后,我的问题是在这种情况下最好的方法是什么,或者我可能做错了什么?。谢谢

PS:例子来自游戏区,但解法不一定适用于游戏,我只是觉得简单易懂。

另一种方法是开发一组可应用于操纵状态的玩家的命令动作。虽然命令对象可以扩展对播放器的访问权限,但外部 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;
    }
}

现在显然,要使它完全有能力做你想做的事,还有很多工作要做,但我们的想法是将你的 public 播放器界面限制在你想要的结构上公开(例如属性、设备、状态等)并将所有动词委托给操作。

在幕后,播放器的实际功能可以分解为尽可能多的组件,以限制每个组件的大小。