委托与暴露属性
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 播放器界面限制在你想要的结构上公开(例如属性、设备、状态等)并将所有动词委托给操作。
在幕后,播放器的实际功能可以分解为尽可能多的组件,以限制每个组件的大小。
我在 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 播放器界面限制在你想要的结构上公开(例如属性、设备、状态等)并将所有动词委托给操作。
在幕后,播放器的实际功能可以分解为尽可能多的组件,以限制每个组件的大小。