رادکام
using System;
class BridgePattern
{
// 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();
}
}
interface Bridge
{
string 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
*/
class BridgePattern : SpaceBookSystem
{
static void Main ()
{
MySpaceBook me = new MySpaceBook();
me.Add("Hello world");
me.Add("Today I worked 18 hours");
Portal tom = new Portal(new MyOpenBook("Tom"));
tom.Poke("Judith");
tom.Add("Judith","Poor you");
tom.Add("Hey, I'm also on OpenBook - it was so easy!");
}
}
کاربرانی مانند Judith می توانند از همان SpaceBook قدیمی استفاده کنند، انگار که هیچ چیز تغییر نکرده است، اما Tom می تواند از کلاس Abstract (Portal) استفاده کرده و از طریق Bridge به کلاس جدید OpenBook متصل شده و به کلاس قدیمی SpaceBook دسترسی پیدا کنند. خروجی برنامه مانند گذشته آغاز می شود اما در ادامه می بینیم که Tom نیازی به ثبت نام یا تایید اعتبار ندارد.
Let's register you for SpaceBook
All SpaceBook names must be unique
Type in a user name: Judith
Type in a password: yey
Thanks for registering with SpaceBook
Welcome Judith. Please type in your password: yey
Logged into SpaceBook
======== Judith's SpaceBook =========
Hello world
Today I worked 18 hours
Tom poked you
Tom : hugged you
================================
======== Judith'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 was so easy!
حال فرض می کنیم که برنامه نویس تصمیم گرفته است که با اضافه کردن شماره سریال به هر
شناسه کاربر از ایجاد
مغایرت جلوگیری کند. اگر کاربر بعدی Pat است، نامش Pat-2 خواهد بود. در
حال حاظر،خروجی Tom همچنان به SpaceBook اشاره دارد زیرا سیستم جدید نیز همچنان
از امکانات SpaceBook استفاده می کند. به مجرد اینکه OpenBook شخصی سازی
(Customize) گردید ، تغییر حاصل خواهد گردید. بخش جلویی در اینترفیس Bridge
محصور (Encapsulate) شده است.
interface Bridge
{
void Add(string message);
void Add(string friend, string message);
void Poke(string who);
}
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 در این مثال، خود به عنوان Proxy برای SpaceBook عمل می کند. بسیاری از مکانیسم های الگوی پروکسی از بین رفته اند، و آنچه باقی مانده است، یک الگوی پروکسی هوشمند است که کار آن نگهداری تعداد شماره سریال کاربران است. حال می توانید OpenBook را در حالت اصلی ببینید.
public class MyOpenBook : Bridge
{
// Combination of a virtual and authentication proxy
SpaceBook mySpaceBook;
string name;
static int users;
public MyOpenBook (string n)
{
name = n;
users++;
mySpaceBook = new SpaceBook(name+"-"+users);
}
public void Add(string message)
{
mySpaceBook.Add(message);
}
public void Add(string friend, string message)
{
mySpaceBook.Add(friend, name + " said: "+message);
}
public void Poke(string who)
{
mySpaceBook.Poke(who,name);
}
}
در نظر داشته باشید که الگوی Bridge عملیاتی را که توسط همه اعضای کلاس Portal پشتیبانی خواهند شد را مشخص
و تعریف می کند. حال فرض کنید کلاس OpenBook بخواهد چند عملیات دیگری مانند
SuperPoke را به برنامه اضافه کند:
public void SuperPoke (string who, string what)
{
myOpenBook.Add(who, what+" you");
}
کلاس SuperPoke به صورتی نسبتا مبتدی در سطح بالای متد Add پیاده سازی شده است، به دلیل اینکه، این یک ویژگی است که توسط SpaceBook پشتیبانی می شود. اگر ما متد SuperPoke را در کلاس OpenBook قرار دهیم، کامپایلر بدون گرفتن ایراد آن را قبول می کند. اما ما نمی توانیم آن را فراخوانی کنیم، زیرا در برنامه اصلی Tom به شیء Portal اشاره می کند، در حالیکه SuperPoke در Portal قرار ندارد. این مشکل را به دو روش می توانیم حل کنیم:
static class OpenBookExtensions
{
public static void SuperPoke (this Portal me, string who, string what)
{
me.Add(who, what+" you");
}
}
و به همان روشی که بقیه متد ها را فراخوانی می کنیم، این متد را فراخوانی می کنیم.
tom.SuperPoke("Judith-1","hugged");
برنامه کامل برای کلاس OpenBook در زیر آورده شده است، کلاس های SpaceBook و MySpaceBook که در بالا دیدیم، به هیچ وجه تغییر نکرده است. در خروجی برنامه ، Judith از Open-book استفاده می کند، بنابراین نام آن به Judith-1 تغییر یافته است، و Top نیز به عنوان دومین کاربر OpenBook، نامش به Tom-2 تغییر یافته است.
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(string friend, string message);
void Poke(string who);
}
class SpaceBookSystem
{
// The Subject
private class SpaceBook { ... }
// The Proxy
public class MySpaceBook { ... }
// 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 BridgePattern : SpaceBookSystem
{
static void Main ( )
{
Portal me = new Portal(new MyOpenBook("Judith"));
me.Add("Hello world");
me.Add("Today I worked 18 hours");
Portal tom = new Portal(new MyOpenBook("Tom"));
tom.Poke("Judith-1");
tom.SuperPoke("Judith-1","hugged");
tom.Add("Judith-1","Poor you");
tom.Add("Hey, I'm on OpenBook - it's cool!");
}
}
/* Output
======== Judith-1's SpaceBook =========
Hello world
===================================
======== Judith-1's SpaceBook =========
Hello world
Today I worked 18 hours
===================================
======== Judith-1's SpaceBook =========
Hello world
Today I worked 18 hours
Tom poked you
Tom : hugged you
===================================
======== Judith-1's SpaceBook =========
Hello world
Today I worked 18 hours
Tom poked you
Tom : hugged you
Tom : Poor you
===================================
======== Tom-2's SpaceBook =========
Hey, I'm on OpenBook - it's cool!
===================================
*/
منبع:
C# 3.0 Design Patterns - Ebook
3,293بازدید
دیدگاه کاربران
هنوز دیدگاهی ثبت نشده است.
شما میتوانید درباره این مقاله، دیدگاه خود را ثبت کنید.