角色对象模式问题

Ber*_*ryl 6 c# design-patterns domain-driven-design

我正在看马丁福勒所做的一篇名为" 处理角色"的文章.在其中,Fowler为组织中的人员(即员工,工程师,经理,推销员)处理角色分析了三个基本策略,其中包括角色子类型,角色对象和角色关系.

在1997年写完它肯定是旧的,作为一个"工作草案"它也有一些错误,否则将不存在.我很困惑看到他经历的一个角色对象的例子,并且包含了我对他下面的一些Java代码的c#解释.

我有三个问题:
(1)有很多类型标识用字符串完成,看起来它应该可以用泛型替换,但我还不知道怎么做.你将如何使用泛型实现此代码?
(2)JobRole在代码中作为类型的字符串名称,但没有使用其余代码明确定义.我不知道这是否是PersonRole的基类.JobRole的定义是什么?单元测试看起来像是模式用法的正确示例吗?
(3)是否有人与更新的实现和使用角色对象的示例有任何关联?

干杯,
Berryl

public class PersonWithRoles : Person
{
    private readonly IList<PersonRole> _roles = new List<PersonRole>();

    public static PersonWithRoles CreatePersonWithRoles(string identifierName) {
        ...
    }

    public void AddRole(PersonRole role) { _roles.Add(role); }

    public PersonRole RoleOf(string typeName) { return _roles.FirstOrDefault(x => x.HasType(typeName)); }
}

public class PersonRole
{
    public virtual bool HasType(string typeName) { return false; }
}

public class Salesman : PersonRole
{
    public override bool HasType(string typeName)
    {
        if (typeName.Equals("Salesman", StringComparison.InvariantCultureIgnoreCase)) return true;
        if (typeName.Equals("JobRole", StringComparison.InvariantCultureIgnoreCase)) return true;

        return base.HasType(typeName);
    }

    public int NumberOfSales { get; set; }

}

[TestFixture]
public class RoleUsageTests
{
    [Test]
    public void Test() {
        var p = PersonWithRoles.CreatePersonWithRoles("Ted");
        var s = new Salesman();
        p.AddRole(s);

        var tedSales = (Salesman) p.RoleOf("Salesman");
        tedSales.NumberOfSales = 50;
    }
}
Run Code Online (Sandbox Code Playgroud)

Kri*_*ian 5

我相信这些类型的应用程序是使用装饰器设计模式的良好候选者,其中有一个Person基类,然后每个角色扩展该基类.基类没有权限声明 - 只有扩展person的角色类才应该.

抱歉模糊不清,但我希望你得到我想要描述的内容.

class programmer {
 name ...
 email ...
 seat location ...
}

class html_coder extends programmer {
 canCodeHTML ...
}

class script_coder extends programmer {
 canCodeHTML ...
 canCodeJavascript ...
}

class senior_developer extends programmer {
 canCodeHTML ...
 canCodeJavascript ...
 canAccessDatabase ...
 canEditProjectArchitectureFiles ...
 canWearTennisShoesToWork...
}
Run Code Online (Sandbox Code Playgroud)

这些都扩展了程序员基类...注意程序员类没有声明权限......只是属性