Mediator i polecenie konkretne

0

Witam!

Mój projekt składa się (m.in) z Mediatora, wzorca Polecenia, obiektów GUI (okienek) i pozostałych obiektów (Firma, Umowa itp). Obiekty GUI nie obsługują interakcji z użytkownikiem, gdyż jest to delegowane do wzorca Polecenie. Problem pojawia się przy wykonywaniu poleceń, które muszą mieć dostęp do prywatnych składowych GUI. Jeżeli kilka poleceń konkretnych będzie korzystało z obiektu GUI, to GUI musi zaprzyjaźnić się z każdym z nich, a to niestety prowadzi do utworzenia dużej listy klas zaprzyjaźnionych. Drugi sposób rozwiązania tego problemu to delegowanie wykonania tych problematycznych poleceń konkretnych do Mediatora. GUI musi zaprzyjaźnić się tylko z mediatorem, ale z drugiej strony tworzy się brzydki duży monolit no i polecenia konkretne, których jedynym zadaniem jest tylko wywołanie operacji Mediatora. Jak uważacie, co będzie mniej szkodliwe: duża lista klas zaprzyjaźnionych, czy monolit? Jeżeli ktoś ma mądrzejszy pomysł (co jest bardzo prawdopodobne ;-)), to również byłbym bardzo wdzięczny za podpowiedź.

Pozdrawiam

Aha. Projekt będzie realizowany w C++, czyli przyjaźnie nie są dziedziczone.

0

Według mnie opcja z mediatorem lepsza.

0

Cześć

Nie wiem czy dobrze całość zrozumiałem, ale jeśli tak to czy to nie jest najlepszym rozwiązaniem aby operacje warstwy logiki wymagały dostępu do argumentów GUI?

pzdr

0
PawelW napisał(a)

Nie wiem czy dobrze całość zrozumiałem, ale jeśli tak to czy to nie jest najlepszym rozwiązaniem aby operacje warstwy logiki wymagały dostępu do argumentów GUI?

Zależy mi na tym, żeby projekt był (w miarę możliwości) łatwy w konserwacji, a wiązanie przyjaźnią każdego obiektu GUI z każdym nowym obiektem logiki jest trochę uciążliwe. Wzorzec Polecenie to prosta droga do powstania wielu obiektów-poleceń konkretnych.

0

Napisz prosze w jakim celu komendy maja miec dostep do GUI ? Pierwsze skojarzenie to po prostu aktualiacja widokow po wykonaniu komendy. Ale wtedy klanialby sie wzorzec Model View Controller.

pzdr,
y.

0

ja polecam mvp (model view presenter), domain model oraz fasade

przyklad [bez fasady, i nie AZ tak elastyczny, bo juz mi sie nie chce wymyslac]

    public interface IView
    {
        event EventHandler ZapisDoBazy;
        string Imie { get; set; }
        string Nazwisko { get; set;}
    }

    public class View : Form, IView
    {
        public string Imie
        {
            get { return textBox1.Text; }
        }

        public string Nazwisko
        {
            get { return textBox2.Text; }
        }

        public event EventHandler ZapisDoBazy;

        private Presenter presenter = null;

        public View()
        {
            presenter = new Presenter(this);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (ZapisDoBazy != null)
                ZapisDoBazy(sender, e);
        }

    }

    public class User
    {
        private string imie = string.Empty;
        public string Imie
        {
            get { return imie; }
            set { imie = value; }
        }

        private string nazwisko = string.Empty;
        public string Nazwisko
        {
            get { return nazwisko; }
            set { nazwisko = value; }
        }

        public User(string imie, string nazwisko)
        {
            this.imie = imie;
            this.nazwisko = nazwisko;
        }
    }

    public class UserDomainModel
    {
        public bool Insert(User user)
        {
            string query = "INSERT INTO users VALUES (:IMIE, :NAZWISKO)";
            //parametry przypisujemy przez: sqlCommand.Parameters.Add(":IMIE", user.Imie) i to samo z user.Nazwisko
            //return ADO.Instance.ExecuteNonQuery(sqlCommand); //wykonuje zapytanie
        }
    }

    public class Presenter
    {
        private IView view = null;
        private UserDomainModel userDomainModel = new UserDomainModel();

        public Presenter(IView view)
        {
            this.view = view;
            Initialize();
        }

        private void Initialize()
        {
            view.ZapisDoBazy += new EventHandler(view_ZapisDoBazy);
        }

        void view_ZapisDoBazy(object sender, EventArgs e)
        {
            userDomainModel.Insert(new User(view.Imie, view.Nazwisko));
        }
    }

1 użytkowników online, w tym zalogowanych: 0, gości: 1