桥接的效果
1桥椄模式可以保持客户端程序的接口不变,而允许读者修改显示类或要使用的类.这可以防止重新编译一系列复杂的用户接口模块,而只需要重新编译Bridge各实际的最终显示类
2.可以分别扩展实现类和Bridage类,二者之间通常不会有相互作用
3.对客户端很容易隐藏实现细节
public
interface
Bridger {
void addData(ArrayList col);
}
public interface VisList{
// add a line to the display
void addLine(Product p);
// remove a line from the display
void removeLine( int num);
}
public class ListBridge : Bridger {
private VisList vis;
// ------
public ListBridge(VisList v){
vis = v;
}
// -----
public void addData(ArrayList ar) {
for ( int i = 0 ; i < ar.Count ; i ++ ) {
Product p = (Product)ar[i];
vis.addLine (p);
}
}
}
public class ProductList : VisList{
private ListBox list;
// -----
public ProductList(ListBox lst) {
list = lst;
}
// -----
public void addLine(Product p) {
list.Items.Add (p.getName() );
}
// -----
public void removeLine( int num) {
if (num >= 0 && num < list.Items.Count ){
list.Items.Remove (num);
}
}
}
public class GridList:VisList {
private DataGrid grid;
private DataTable dtable;
private GridAdapter gAdapter;
// -----
public GridList(DataGrid grd) {
grid = grd;
dtable = new DataTable( " Products " );
DataColumn column = new DataColumn( " ProdName " );
dtable.Columns.Add(column);
column = new DataColumn( " Qty " );
dtable.Columns.Add(column);
grid.DataSource = dtable;
gAdapter = new GridAdapter (grid);
}
// -----
public void addLine(Product p) {
gAdapter.Add (p);
}
// -----
public void removeLine( int num) {
}
}
public class Invoke
{
private void init()
{
products = new ArrayList ();
readFile(products); // read in the data file
// create the product list
prodList = new ProductList (lsProd);
// Bridge to product VisList
Bridger lbr = new ListBridge (prodList);
// put the data into the product list
lbr.addData (products);
// create the grid VisList
gridList = new GridList(grdProd);
// Bridge to the grid list
Bridger gbr = new ListBridge (gridList);
// put the data into the grid display
gbr.addData (products);
}
}
// -------------------------------
// 可排序的桥
public class SortBridge:ListBridge {
// -----
public SortBridge(VisList v): base (v){
}
// -----
public override void addData(ArrayList ar) {
int max = ar.Count ;
Product[] prod = new Product[max];
for ( int i = 0 ; i < max ; i ++ ) {
prod[i] = (Product)ar[i];
}
for ( int i = 0 ; i < max ; i ++ ) {
for ( int j = i; j < max; j ++ ) {
if (prod[i].CompareTo (prod[j]) > 0 ) {
Product pt = prod[i];
prod[i] = prod[j];
prod[j] = pt;
}
}
}
for ( int i = 0 ; i < max; i ++ ) {
vis.addLine (prod[i]);
}
}
}
void addData(ArrayList col);
}
public interface VisList{
// add a line to the display
void addLine(Product p);
// remove a line from the display
void removeLine( int num);
}
public class ListBridge : Bridger {
private VisList vis;
// ------
public ListBridge(VisList v){
vis = v;
}
// -----
public void addData(ArrayList ar) {
for ( int i = 0 ; i < ar.Count ; i ++ ) {
Product p = (Product)ar[i];
vis.addLine (p);
}
}
}
public class ProductList : VisList{
private ListBox list;
// -----
public ProductList(ListBox lst) {
list = lst;
}
// -----
public void addLine(Product p) {
list.Items.Add (p.getName() );
}
// -----
public void removeLine( int num) {
if (num >= 0 && num < list.Items.Count ){
list.Items.Remove (num);
}
}
}
public class GridList:VisList {
private DataGrid grid;
private DataTable dtable;
private GridAdapter gAdapter;
// -----
public GridList(DataGrid grd) {
grid = grd;
dtable = new DataTable( " Products " );
DataColumn column = new DataColumn( " ProdName " );
dtable.Columns.Add(column);
column = new DataColumn( " Qty " );
dtable.Columns.Add(column);
grid.DataSource = dtable;
gAdapter = new GridAdapter (grid);
}
// -----
public void addLine(Product p) {
gAdapter.Add (p);
}
// -----
public void removeLine( int num) {
}
}
public class Invoke
{
private void init()
{
products = new ArrayList ();
readFile(products); // read in the data file
// create the product list
prodList = new ProductList (lsProd);
// Bridge to product VisList
Bridger lbr = new ListBridge (prodList);
// put the data into the product list
lbr.addData (products);
// create the grid VisList
gridList = new GridList(grdProd);
// Bridge to the grid list
Bridger gbr = new ListBridge (gridList);
// put the data into the grid display
gbr.addData (products);
}
}
// -------------------------------
// 可排序的桥
public class SortBridge:ListBridge {
// -----
public SortBridge(VisList v): base (v){
}
// -----
public override void addData(ArrayList ar) {
int max = ar.Count ;
Product[] prod = new Product[max];
for ( int i = 0 ; i < max ; i ++ ) {
prod[i] = (Product)ar[i];
}
for ( int i = 0 ; i < max ; i ++ ) {
for ( int j = i; j < max; j ++ ) {
if (prod[i].CompareTo (prod[j]) > 0 ) {
Product pt = prod[i];
prod[i] = prod[j];
prod[j] = pt;
}
}
}
for ( int i = 0 ; i < max; i ++ ) {
vis.addLine (prod[i]);
}
}
}
摘抄中文版的C#设计模式中的桥接模式一例
桥椄模式主要的意图是"将抽象部分与它的实现部分分离,使它们都可独立的变化"