Я пытаюсь применить шаблон оформления декоратора к следующей ситуации:
У меня есть 3 различных вида форм: зеленый, желтый, красный.
Теперь каждая из этих форм может иметь различный набор атрибутов. У них может быть отключено поле минимизации, отключено поле максимизации, и они всегда могут быть сверху.
Я попытался смоделировать это следующим образом:
Form <---------------------------------------FormDecorator
/\ /\
|---------|-----------| |----------------------|-----------------|
GreenForm YellowForm RedForm MinimizeButtonDisabled MaximizedButtonDisabled AlwaysOnTop
Вот мой код GreenForm:
public class GreenForm : Form {
public GreenForm() {
this.BackColor = Color.GreenYellow;
}
public override sealed Color BackColor {
get { return base.BackColor; }
set { base.BackColor = value; }
}
}
FormDecorator:
public abstract class FormDecorator : Form {
private Form _decoratorForm;
protected FormDecorator(Form decoratorForm) {
this._decoratorForm = decoratorForm;
}
}
и, наконец, NoMaximizeDecorator:
public class NoMaximizeDecorator : FormDecorator
{
public NoMaximizeDecorator(Form decoratorForm) : base(decoratorForm) {
this.MaximizeBox = false;
}
}
Итак, вот бегущий код:
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(CreateForm());
}
static Form CreateForm() {
Form form = new GreenForm();
form = new NoMaximizeDecorator(form);
form = new NoMinimizeDecorator(form);
return form;
}
Проблема в том, что я получаю не зеленую форму, которая позволяет мне максимизировать ее. Это только принимая во внимание форму NoMinimizeDecorator. Я понимаю, почему это происходит, но мне трудно понять, как заставить это работать с этим шаблоном.
Я знаю, вероятно, есть лучшие способы достижения того, чего я хочу. Я сделал этот пример как попытку применить шаблон декоратора к чему-либо. Возможно, это был не лучший шаблон, который я мог бы использовать (если вообще использовал) для такого сценария. Есть ли другой шаблон, более подходящий для этого, чем декоратор? Я что-то не так делаю, когда пытаюсь реализовать Pattern Decorator?
Спасибо