Предложить лучший подходящий дизайн паттен

У меня есть постановка задачи, в которой мне нужно спроектировать классы таким образом, чтобы их поведение решалось во время выполнения.

Классовая иерархия выглядит следующим образом;

                       Base
______________|________________
|           |        |         |
Drvd-A     DrvdB     DrvdC   Drvd-Generic

Экземпляр типа «Drvd-Generic» должен в принципе наследовать поведение любого из классов «Drvd-A», «Drvd-B» или «Drvd-C» во время выполнения.

Поведение экземпляра «Drvd-Generic» будет определено во время выполнения и может быть изменено также во время выполнения.
Например;
— создан экземпляр Drvd-Generic;
— в течение определенного времени и при определенных условиях Drvd-Generic должен наследовать поведение Drvd-A;
— после запуска некоторых изменений Drvd-Generic должен наследовать поведение Drvd-B;

Это произойдет во время выполнения при возникновении определенных условий, и экземпляр Drvd-Generic будет тем же самым в течение срока действия программы.

Предложите лучший шаблон дизайна для вашего случая.

1

Решение

Drvd-Generic мог бы реализовать стратегия шаблон, и использовать внутренние экземпляры DrvdA / DrvdB и т.д., чтобы сделать свою работу.

2

Другие решения

Выглядит как шаблон стратегии W / композиция будет работать, где у вас есть член типа Behavior, (псевдокод следует)

class Behavior
{
virtual execute() = 0;
}
class BehaviorA
{
virtual execute();
}
//and others

class Base
{
Behavior* behavior;
}
class Drvd-A : Base
{
//set behavior to BehaviorA
}
//and others
class Drvd-Generic
{
//set & change behavior at runtime
}
1

Как насчет шаблон декоратора?

interface Base
{
//This is the interface which specifies the members
}
class Drvd-Generic : Base
{
//This implements the base class
}
class DrvdA : Base
{
//This class has a member of type Drvd-Generic
//The constructor accespts the Drvd-Generic object
//This can define DrvdA specific functions to further work on it.
//Basically this is the decorator class.
//As are DrvdB and DrvdC
}
class DrvdB : Base
{
}
class DrvdC : Base
{
}

Надеюсь, это поможет вам.

0