惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
Google DeepMind News
Google DeepMind News
Microsoft Security Blog
Microsoft Security Blog
Martin Fowler
Martin Fowler
MyScale Blog
MyScale Blog
The GitHub Blog
The GitHub Blog
I
InfoQ
A
About on SuperTechFans
GbyAI
GbyAI
宝玉的分享
宝玉的分享
爱范儿
爱范儿
博客园 - 【当耐特】
博客园 - 司徒正美
博客园 - 聂微东
P
Proofpoint News Feed
WordPress大学
WordPress大学
云风的 BLOG
云风的 BLOG
Last Week in AI
Last Week in AI
阮一峰的网络日志
阮一峰的网络日志
B
Blog RSS Feed
Jina AI
Jina AI
aimingoo的专栏
aimingoo的专栏
J
Java Code Geeks
博客园 - 叶小钗

博客园 - 心雨无痕

升级openssl和openssh linux配置LVM 杂七杂八 .net程序包含webbrowser插件时遇到的各种问题 mysql连接远程服务器很慢的解决方法 centos安装php需要注意的问题 centos配置nfs杂七杂八 iptables配置网络端口转发 适配器模式 单例模式 原型模式 工厂方法模式 简单工厂模式 建造者模式 ActionScript中Object和Dictionary的区别 FlashBuilder4.5破解方法 抽象工厂模式 设计模式浅见 了解下常见的开源协议
桥接模式
心雨无痕 · 2012-07-21 · via 博客园 - 心雨无痕

桥接模式用于将有多个维度变化的产品中的变化维度抽取出来单独处理,用GOF的定义是:将抽象部分与实现部分分离,使它们都可以独立的变化。

桥接模式概述

桥接模式的基本定义里面包括了四种角色(假设产品只具有2个维度的变化Fa和Fb):

1. 抽象产品类角色Abstraction,该类是产品的基类,它直接负责产品的架构定义和接口定义并定义维度变化方法Fa,它内部包含了一个接口类Implementor

2. 变化维度实现接口类Implementor,该接口是抽取的A中某种需要经常变化的维度或者说方法而产生的,它定义了变化的维度所需要实现的方法Fb

3. 具体产品类角色RefinedAbstraction,该类继承Abstraction,实现具体的产品构建Fa

4. 变化维度实现类ConcreteImplementor,该类实现接口Implementor,具体实现维度变化方法Fb

模式设计图如下

bridge

说白话点,其实就是在A和IB中各实现一个维度变化的方法,产品本身实现一个维度的变化,而将另外一个维度的变化抽象出一个接口,然后将该接口实现包含在产品类中来实现产品2个维度的解耦。

桥接模式的伪代码实现

以画图为例,画的图可能是圆形或者矩形,圆形和矩形的内部结构是不同的(举例为缩放resize),而且他们的绘制方法也是不同的(draw),因此就存在2个维度的变化(resize和draw),我们抽象圆形和矩形都是形状,绘制方法抽象为draw。

interface drawsth
{
  void drawme();
}
public class drawsth1 implements drawsth
{
  public void drawme()
  {
     //do draw
  }
}
public class drawsth2 implements drawsth
{
  public void drawme()
  {
    // do draw
  }
}
abstract class shape
{
  public void draw();
  publlic void resize();
}
class rect extends shape
{
  private drawsth _innerdraw;
  public rect(drawsth dd)
  {
    _innerdraw = dd;
  }
  public void draw()
  {
    _innerdraw.drawme();
  }
  public void resize()
  {
    // do resize things
  }
}
class circle extends shape
{
  private drawsth _innerdraw;
  public circle(drawsth dd)
  {
    _innerdraw = dd;
  }
  public void draw()
  {
    _innerdraw.drawme();
  }
  public void resize()
  {
    // do resize things
  }
}
class mybridge {
 public static void main(String[] args)
 {
   shape mshape1 = new rect(new drawsth1());
   shape mshape2 = new circle(new drawsth2());
 
   mshape1.draw(); mshape1.resize();
   mshape2.draw(); mshape2.resize();
 }
}