授权与暴露属性

时间:2015-01-27 18:31:42

标签: c# design-patterns

我在类中查看类似门面的委托,例如假设你有了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:示例来自游戏区域,但解决方案不一定适用于游戏,我只是觉得它很容易理解。

1 个答案:

答案 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)并将所有动词委托给动作。

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