これが非常に古い投稿であることは知っていますが、同じ答えを探していて、受け入れられる答えが見つかりませんでした. 最初は Decorator パターンが最も明白に思えますが、すべてのロールが同じメソッドを実装する必要があるため、これは実際には私が望んでいたものではありません (そうでなくても、顧客に BlockUserAccount() メソッドを持たせたいですか?) )、新しい動作が実装されるたびに、すべての役割を拡張する必要があります。
代わりに、実験を通じて、委任パターンのバリエーションが最適であるように思われることがわかりました。Delegation パターンについて読んだことはすべてメイン オブジェクトのスーパークラスに関係しているため、「バリエーション」と言いますが、それは私が最終的に行ったことではありません。
私が行ったことは、基本的なユーザー オブジェクトを使用することであり、ロールのコレクションが含まれています。これらのロールは、それぞれが独自のメソッドを持ち、それぞれが独自のインターフェイスを持つ、まったく異なるタイプのクラスとして定義されます。その後、必要に応じてロールが委任されます。
public interface ICustomerAlaCarte
{
void AuthorizePayment(decimal paymentAmount);
}
public abstract class UserRole { }
public class CustomerAlaCarte : UserRole, ICustomerAlaCarte
{
public void AuthorizePayment(decimal paymentAmount)
{
// Logic here
}
}
public class User
{
private List<UserRole> _userRoles;
public void AddUserRole(UserRole newRole)
{
_userRoles.Add(newRole);
}
public ICustomerAlaCarte AsAlaCarteCustomer()
{
ICustomerAlaCarte alaCarteRole = _userRoles.OfType<ICustomerAlaCarte>().FirstOrDefault();
if (alaCarteRole != null)
{
return alaCarteRole;
}
else
{
throw new UserRoleNotAssignedException(); // Custom exception
}
}
}
次に使用します:
var user = new User();
user.AddUserRole(new CustomerAlaCarte());
ICustomerAlaCarte customer = user.AsAlaCarteCustomer();
customer.AuthorizePayment(9.99);
このパターンを使用すると、ロールをネストすることもできます。たとえば、ユーザー管理者とレポート管理者を持つことができ、それぞれが管理者から継承されます。基本的な管理機能 (または ID) のみが必要な場合は、管理デリゲートをプルしますが、前述の BlockUserAccount() の動作に IUserAdmin を指定することもできます。これは、各ロールに意味のあるメソッドしかないためです。