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)
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
ارجو قراءة المثال جيدا وشرحه لن يختلف كثيرا عن شرح المثال السابق
لذلك لن اقوم بشرحه مرة ولكن لو وجد اي استفسارساكون سعيد بالرد عليه
ليست هناك تعليقات:
إرسال تعليق