前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式之桥接模式(结构型)

设计模式之桥接模式(结构型)

作者头像
SmileNicky
发布2019-03-15 15:49:01
3490
发布2019-03-15 15:49:01
举报
文章被收录于专栏:Nicky's blogNicky's blog

模式定义

桥接模式(Bridge Pattern)是将抽象部分和实现部分分离,使它们可以独立地改变,是一种对象结构型模式。

模式角色

桥接模式包含如下角色:

  • Abstraction(抽象类)
  • RefinedAbstraction(扩充抽象类)
  • Implementor(实现类接口)
  • ConcreteImplementor(具体实现类)

模式分析

桥接模式关键在于如何将抽象化与实现化解耦,使得两者可以独立改变。

抽象化:抽象就是忽略一些信息,将不同的实体当作同样的实体对待。在面向对象中将对象的共同性质抽取出来形成类的过程称之为抽象化的过程

实现化:针对抽象话给出的具体实现,就是实现化,抽象化与实现化是互逆的过程

解耦:解耦就是将抽象化和实现化直接的耦合解脱开,或者说将两者之间的强关联变成弱关联,将两个角色由继承改成关联关系(组合或者聚合)

典型代码:

代码语言:javascript
复制
public interface Implementor
{
	public void operationImpl();
} 
代码语言:javascript
复制
public abstract class Abstraction
{
	protected Implementor impl;
	
	public void setImpl(Implementor impl)
	{
		this.impl=impl;
	}
	
	public abstract void operation();
} 
代码语言:javascript
复制
public class RefinedAbstraction extends Abstraction
{
	public void operation()
	{
		//代码
		impl.operationImpl();
		//代码
	}
} 

模式例子

画出不同颜色的圆,DrawAPI 接口的实体类 RedCircle、GreenCircle。Shape 是一个抽象类,例子来自:http://www.runoob.com/design-pattern/bridge-pattern.html

创建桥接接口:

代码语言:javascript
复制
public interface DrawAPI {
   public void drawCircle(int radius, int x, int y);
}

接口具体实现类:

代码语言:javascript
复制
public class RedCircle implements DrawAPI {
   @Override
   public void drawCircle(int radius, int x, int y) {
      System.out.println("Drawing Circle[ color: red, radius: "
         + radius +", x: " +x+", "+ y +"]");
   }
}
代码语言:javascript
复制
public class GreenCircle implements DrawAPI {
   @Override
   public void drawCircle(int radius, int x, int y) {
      System.out.println("Drawing Circle[ color: green, radius: "
         + radius +", x: " +x+", "+ y +"]");
   }
}

抽象类关联方式实现接口:

代码语言:javascript
复制
public abstract class Shape {
   protected DrawAPI drawAPI;
   protected Shape(DrawAPI drawAPI){
      this.drawAPI = drawAPI;
   }
   public abstract void draw();  
}

具体类实现抽象类:

代码语言:javascript
复制
public class Circle extends Shape {
   private int x, y, radius;
 
   public Circle(int x, int y, int radius, DrawAPI drawAPI) {
      super(drawAPI);
      this.x = x;  
      this.y = y;  
      this.radius = radius;
   }
 
   public void draw() {
      drawAPI.drawCircle(radius,x,y);
   }
}
代码语言:javascript
复制
public class BridgePatternDemo {
   public static void main(String[] args) {
      Shape redCircle = new Circle(100,100, 10, new RedCircle());
      Shape greenCircle = new Circle(100,100, 10, new GreenCircle());
 
      redCircle.draw();
      greenCircle.draw();
   }
}

打印到控制台:

代码语言:javascript
复制
Drawing Circle[ color: red, radius: 10, x: 100, 100]
Drawing Circle[  color: green, radius: 10, x: 100, 100]

模式应用

  • 一些软件的跨平台设计有时候也是应用了桥接模式
  • JDBC的驱动程序,实现了将不同类型的数据库与Java程序的绑定
  • Java虚拟机实现了平台的无关性,Java虚拟机设计就是通过桥接模式
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年03月11日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 模式定义
  • 模式角色
  • 模式分析
  • 模式例子
  • 模式应用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档