بحث هذه المدونة الإلكترونية

الأربعاء، 26 مايو 2010

Bridge Pattern


Bridge Pattern

هذا النمط يقوم على فصل كيفية بداية عمل الاوبجيكت  و المحتوى او الناتج النهائي فهو يفصل بين ال (abstraction ) و (implementation  ) . وهذا يفيد في البرامج التي يكون لها تحديثات فجزء منها ثابت وهو الموضوع به ال abstraction   وهو الذي يقوم باستدعاء دالة معينة في الجزء الاخر و هو ال implementaion فتظهر النتائج دون تدخل من الجزء الاول

دعنا نبدا بمثال صغير لكي تتضح الفكرة:


using System; 

class BridgePattern 
{

    interface Bridge
    {
        string OperationImp();
    } 

    // Bridge Pattern Judith Bishop Dec 2006, Aug 2007
    // Shows an abstraction and two implementations proceeding independently

    class Abstraction
    {
        Bridge bridge;
        public Abstraction(Bridge implementation)
        {
            bridge = implementation;
        }
        public string Operation()
        {
            return "Abstraction" + "<<< BRIDGE >>>> " + bridge.OperationImp();
        }
    }


    class ImplementationA : Bridge
    {
        public string OperationImp()
        {
            return "ImplementationA";
        }
    } 

    class ImplementationB : Bridge
    {
        public string OperationImp()
        {
            return "ImplementationB";
        }
    }

    static void Main()
    {
        Console.WriteLine("Bridge Pattern\n");
        Console.WriteLine(new Abstraction(new ImplementationA()).Operation());
        Console.WriteLine(new Abstraction(new ImplementationB()).Operation());
    }
}

/* Output
Bridge Pattern Abstraction <<< BRIDGE >>>>ImplementationA
Abstraction <<< BRIDGE >>>> ImplementationB
*/

 في البداية قمنا بتعريف interface يقوم بعملية معينة .

ثم قمنا بتعريف abstraction وهي الكلاس البريدج وفي دالة Constructor نمرر اوبجيكت من ال Interface علما بان اي كلاس تريد ان تجعلها تعمل من خلال البريدج لابد ان ترث من هذا ال Interface  ثم قمنا بانشاء كلاسيين كلاهما موروث من ال Interface كل منهما يؤدي وظيفة مختلفة
ولكن دالة استدعاء الوظائف به طبعا مسماها واحد وذلك بفضل الوراثة من الانترفيس وبذلك يستطيع abstraction class ان يقوم بالعمل مع اي كلاس موروث من الانترفيس مهما كان الناتج من العمليات الداخلية للكلاس 

 مثال اكثر تعقيدا ... مستندا على المثال السابق في شرح ال Proxy

using System;

using System.Collections.Generic;
// Bridge Pattern Example Judith Bishop Dec 2006, Aug 2007
// Extending SpaceBook with a second implementation via a Portal
// Abstraction

class Portal
{
    Bridge bridge;
    public Portal(Bridge aSpaceBook)
    { 
        bridge = aSpaceBook;
    }

    public void Add(string message)
    {
        bridge.Add(message);
    }

    public void Add(string friend, string message)
    {
        bridge.Add(friend, message);
    }
    public void Poke(string who)
    {
        bridge.Poke(who);
    }

// Bridge
interface Bridge
{
    void Add(string message);
    void Add(stringfriend, string message);
    void Poke(string who);
} 

class SpaceBookSystem
{
    // The Subject
    private class SpaceBook
    {
        static SortedList<string,SpaceBook> community = new SortedList<string, SpaceBook>(100);
        string pages;
        string name;
        string gap = "\n\t\t\t\t";
        static public bool IsUnique(string name)
        {
            return community.ContainsKey(name);
        }
        internal SpaceBook(string n)
        {
            name = n;
            community[n] = this;
        }
        internal void Add(string s)
        {
            pages += gap + s;
            Console.WriteLine(gap + "======== " + name + "'s SpaceBook =========");
            Console.WriteLine(pages);
            Console.WriteLine(gap + "==========================");
        }

        internal void Add(string friend, string message)
        {
            community[friend].Add(message);
        }

        internal void Poke(string who, string friend)
        {
            community[who].pages += gap + friend + " poked you";
        }
    }
    // The Proxy
    public class MySpaceBook : Bridge
    {
        // Combination of a virtual and authentication proxy
        SpaceBook mySpaceBook;
        string password;
        string name;
        bool loggedIn = false;

        void Register()
        {
            Console.WriteLine("Let's register you for SpaceBook");
            do
            {
                Console.WriteLine("All SpaceBook names must be unique");
                Console.Write("Type in a user name: ");
                name = Console.ReadLine();
            } while (SpaceBook.IsUnique(name));
            Console.Write("Type in a password: ");
            password = Console.ReadLine();
            Console.WriteLine("Thanks for registering with SpaceBook");
        }
        bool Authenticate()
        {
            Console.Write("Welcome " + name + ". Please type in your password: ");
            string supplied = Console.ReadLine();
            if (supplied == password)
            {
                loggedIn = true;
                Console.WriteLine("Logged into SpaceBook");
                if (mySpaceBook == null)
                    mySpaceBook = new SpaceBook(name);
                return true;
            }
            Console.WriteLine("Incorrect password");
            return false;
        }
        public void Add(string message)
        {
            Check();

            if (loggedIn)
                mySpaceBook.Add(message);
        }
        public void Add(string friend, string message)
        {
            Check();
            if (loggedIn)
                mySpaceBook.Add(friend, name + " said: " + message);
        }
        public void Poke(string who)
        {
            Check();
            if (loggedIn)
                mySpaceBook.Poke(who, name);
        }
        void Check()
        {
            if (!loggedIn)
            {
                if (password == null)
                    Register();
                if (mySpaceBook == null)
                    Authenticate();
            }
        }
    } 

    // A Proxy with little to do
    // Illustrates an alternative implementation of the Bridge pattern   

    public class MyOpenBook : Bridge
    {
        // Combination of a virtual and authentication proxy
        SpaceBook myOpenBook;
        string name;
        static int users;
        public MyOpenBook(string n)
        {
            name = n;
            users++;
            myOpenBook = new SpaceBook(name + "-" + users);
        }

        public void Add(string message)
        {
            myOpenBook.Add(message);
        }

        public void Add(string friend, string message)

        {
            myOpenBook.Add(friend, name + ": " + message);
        }

        public void Poke(string who)
        {
            myOpenBook.Poke(who, name);
        }
    }
}

static class OpenBookExtensions
{
    public static
void SuperPoke(this
Portal me, string who, string what)
    {
        me.Add(who, what + "you");
    }
}
// The Client
class BridgePattern1 : SpaceBookSystem
{
    static void Main()
    {
        //Write name : hima to work
        Portal me = new Portal(new MySpaceBook());
        me.Add("Hello world");
        me.Add("Today I worked 18 hours");      

        Portal tom = new Portal(new MyOpenBook("Tom"));
        tom.Poke("hima");
        tom.SuperPoke("hima""hugged");
        tom.Add("hima", "Poor you");
        tom.Add("Hey, I'm on OpenBook - it's cool!");
    }
}
/*



                                ======== hima's SpaceBook =========


                                Hello world 
========================== 

                                ======== hima's SpaceBook ========= 

                                Hello world
                                Today I worked 18 hours 
                                ========================== 

                                ======== hima's SpaceBook ========= 

                                Hello world
                                Today I worked 18 hours
                                Tom poked you
                                Tom : hugged you


                             
==========================


                                ======== hima's SpaceBook ========= 

                                Hello world
                                Today I worked 18 hours
                                Tom poked you
                                Tom : hugged you
                                Tom : Poor you
                             
==========================

                                ======== Tom-1's SpaceBook =========

                                Hey, I'm on OpenBook - it's cool!                               
==========================

*/

الجديد قمنا بانشاء Interface  اسمه braidge واصبح ال MySpaceBook ترث منه وقمنا ايضا بانشاء كلاس جديدة وهي ال portal وهي التي ستقوم بعمل البريدج وايضا كلاس MyOpenBook


ارجو قراءة المثال جيدا  وشرحه لن يختلف كثيرا عن شرح المثال السابق
لذلك لن اقوم بشرحه مرة ولكن لو وجد اي استفسارساكون سعيد بالرد عليه







ليست هناك تعليقات:

إرسال تعليق