Defination: Decouple an abstraction from its implementation so that the two can vary independently.
This structural code demonstrates the Bridge pattern which separates (decouples) the interface from its implementation. The implementation can evolve without changing clients which use the abstraction of the object.
// Bridge pattern -- Structural example
namespace DoFactory.GangOfFour.Bridge.Structural
/// MainApp startup class for Structural
/// Bridge Design Pattern.
/// Entry point into console application.
Abstraction ab = new RefinedAbstraction();
// Set implementation and call
ab.Implementor = new ConcreteImplementorA();
// Change implemention and call
ab.Implementor = new ConcreteImplementorB();
/// The 'Abstraction' class
protected Implementor implementor;
public Implementor Implementor
set { implementor = value; }
public virtual void Operation()
/// The 'Implementor' abstract class
abstract class Implementor
public abstract void Operation();
/// The 'RefinedAbstraction' class
class RefinedAbstraction : Abstraction
public override void Operation()
/// The 'ConcreteImplementorA' class
class ConcreteImplementorA : Implementor
public override void Operation()
Console.WriteLine("ConcreteImplementorA Operation");
/// The 'ConcreteImplementorB' class
class ConcreteImplementorB : Implementor
public override void Operation()
Console.WriteLine("ConcreteImplementorB Operation");
// Bridge pattern -- Real World example
using System.Collections.Generic;
namespace DoFactory.GangOfFour.Bridge.RealWorld
/// MainApp startup class for Real-World
/// Bridge Design Pattern.
/// Entry point into console application.
// Create RefinedAbstraction
Customers customers = new Customers("Chicago");
// Set ConcreteImplementor
customers.Data = new CustomersData();
customers.Add("Henry Velasquez");
/// The 'Abstraction' class
private DataObject _dataObject;
public CustomersBase(string group)
set { _dataObject = value; }
get { return _dataObject; }
public virtual void Next()
_dataObject.NextRecord();
public virtual void Prior()
_dataObject.PriorRecord();
public virtual void Add(string customer)
_dataObject.AddRecord(customer);
public virtual void Delete(string customer)
_dataObject.DeleteRecord(customer);
public virtual void Show()
_dataObject.ShowRecord();
public virtual void ShowAll()
Console.WriteLine("Customer Group: " + group);
_dataObject.ShowAllRecords();
/// The 'RefinedAbstraction' class
class Customers : CustomersBase
public Customers(string group)
public override void ShowAll()
Console.WriteLine("------------------------");
Console.WriteLine("------------------------");
/// The 'Implementor' abstract class
abstract class DataObject
public abstract void NextRecord();
public abstract void PriorRecord();
public abstract void AddRecord(string name);
public abstract void DeleteRecord(string name);
public abstract void ShowRecord();
public abstract void ShowAllRecords();
/// The 'ConcreteImplementor' class
class CustomersData : DataObject
private List<string> _customers = new List<string>();
private int _current = 0;
// Loaded from a database
_customers.Add("Jim Jones");
_customers.Add("Samual Jackson");
_customers.Add("Allen Good");
_customers.Add("Ann Stills");
_customers.Add("Lisa Giolani");
public override void NextRecord()
if (_current <= _customers.Count - 1)
public override void PriorRecord()
public override void AddRecord(string customer)
_customers.Add(customer);
public override void DeleteRecord(string customer)
_customers.Remove(customer);
public override void ShowRecord()
Console.WriteLine(_customers[_current]);
public override void ShowAllRecords()
foreach (string customer in _customers)
Console.WriteLine(" " + customer);