java 23种常用设计模式之桥接模式(Bridge)

本文通过一个生动的例子介绍了桥接模式的应用。桥接模式能够将抽象与实现分离,从而实现两者的独立变化。文章通过富二代王XX管理不同公司的故事,展示了如何使用桥接模式简化系统扩展,并提高代码复用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

王XX,万XX小王子,富二代,国民老公……大家都听说过我就不对他进行简介一番了!他老爸的将来都是他的,至于他清不清楚自己家到底有多少公司,涉及多少个行业,善良的王XX只要知道这些公司是不是赚钱,赚了多少。有人会用善良来形容商人的吗?这个貌似什么唯利是图之类的多一些……

这次要讲的是桥接模式,和这些茶余饭后的闲聊有什么关系呢?

桥接模式就是把事物和其具体实现分开,使他们可以各自独立的变化。桥接的用意是:将抽象化与实现化解耦,使得二者可以独立变化,像常用的JDBC桥DriverManager一样,JDBC进行连接数据库的时候,在各个数据库之间进行切换,基本不需要动太多的代码,甚至丝毫不用改动,原因就是JDBC提供统一接口,每个数据库提供各自的实现,用一个叫做数据库驱动的程序来桥接就行了。看类图,代码大家可以去找来看看:


还是没说桥接模式和王XX有什么关系呀?!

有关系的,王XX一开始有个袜子公司,还有个手套公司,天这么冷,也懒得每个公司都走一趟,但是又想知道这两家公司到底赚不赚钱,然后,然后看代码吧!

package com.freedom.bridge;

public abstract class Computers {
	protected abstract void produce();
	protected abstract void sell();
	public void makeMoney(){
		this.produce();
		this.sell();
	}
}

package com.freedom.bridge;

public class SocksComputer extends Computers{

    @Override
    protected void produce() {
        System.out.println("这个公司是生产袜子……");
        
    }

    @Override
    protected void sell() {
        System.out.println("袜子大卖……");
        
    }
    
    public void makeMoney(){
        super.makeMoney();
        System.out.println("袜子超赚钱……");
    }

}
package com.freedom.bridge;

public class GlovesComputer extends Computers{

    @Override
    protected void produce() {
        System.out.println("这个公司是生产手套的……");
        
    }

    @Override
    protected void sell() {
        System.out.println("虽然没什么戴手套的习惯,但是天这么冷还是有市场的……");
        
    }
    
    public void makeMoney(){
        super.makeMoney();
        System.out.println("手套赚一点点……");
    }

}
package com.freedom.bridge;

public class WangXX {

    public static void main(String[] args) {
        System.out.println("王XX视察袜子公司:");
        SocksComputer sc = new SocksComputer();
        sc.makeMoney();
        
        System.out.println("\n王XX视察手套公司:");
        GlovesComputer gc = new GlovesComputer();
        gc.makeMoney();
       
    }

}
/*
运行结果:
王XX视察袜子公司:
这个公司是生产袜子……
袜子大卖……
袜子超赚钱……

王XX视察手套公司:
这个公司是生产手套的……
虽然没什么戴手套的习惯,但是天这么冷还是有市场的……
手套赚一点点……
*/
一目了然,袜子和手套都赚了不少哦!王XX可乐了,他说我不能满足与这一丢丢,老爸不是还有个围巾公司吗?天这么冷,围巾的销量应该也不错,再来看看围巾公司怎么样了……

package com.freedom.bridge;

public class ScarfComputer extends Computers{

	@Override
	protected void produce() {
		System.out.println("这个公司是生产围巾的……");
		
	}

	@Override
	protected void sell() {
		System.out.println("虽然没什么戴围巾的习惯,但是天还是这么冷,会大卖吧……");
		
	}
	
	public void makeMoney(){
		super.makeMoney();
		System.out.println("围巾赚的还真不少……");
	}

}
<pre name="code" class="java">public class WangXX {

    public static void main(String[] args) {
       System.out.println("\n王XX视察围巾公司:");
       ScarfComputer scc = new ScarfComputer();
       scc.makeMoney();
       
    }

}
/*
运行结果:
王XX视察围巾公司:
这个公司是生产围巾的……
虽然没什么戴围巾的习惯,但是天还是这么冷,会大卖吧……
围巾赚的还真不少……
*/ 

 富二代真好!神马都不用做,每天看看老爸的这些公司赚了多少钱就行了! 

这就是桥接模式啦!把事物和其具体实现分开,使他们可以各自独立的变化。王XX可不是古代地主家的呆儿子,虽然老爸很有钱,如果钱不是源源不断的来,总有一天会挥霍完的。所以不能闲着,夏天不冷了,袜子公司还可以继续大生产丝袜,但是围巾、手套基本没人会买,要充分利用公司资源的话,要针对季节适当转型才行。先试一下吧围巾公司转型生产小短裙怎么样呢?让公司直接和产品挂钩,冬天想生产围巾就生产围巾,到了夏天就生产小短裙,这个的话一年365天每天都能赚大钱岂不是很赞!看代码:

package com.freedom.bridge;

public abstract class Products {
    protected abstract void beProduced();
    protected abstract void beSold();
}
package com.freedom.bridge;
public abstract class Computers2 {
   private Products product;
   public Computers2(Products product){
      this.product = product;
      public void makeMoney(){
         this.product.beProduced();
         this.product.beSold();
      }
  }
}

package com.freedom.bridge;

public class Skirts extends Products{

    @Override
    protected void beProduced() {
        System.out.println("小短裙正在生产了一大波……");
        
    }

    @Override
    protected void beSold() {
        System.out.println("夏天来了!小短裙正在热卖……");
        
    }

}

package com.freedom.bridge;

public class ScarfComputerToSkirts extends Computers2{

    
    public ScarfComputerToSkirts(Skirts skirts) {
        super(skirts);
    }

    public void makeMoney(){
        super.makeMoney();
        System.out.println("小短裙在夏天很赚钱……");
    }

}

package com.freedom.bridge;

public class WangXX {

    public static void main(String[] args) {
        
        System.out.println("\n王XX视察围巾公司转型成小短裙后的情况:");
        ScarfComputerToSkirts scts = new ScarfComputerToSkirts(new Skirts());
        scts.makeMoney();
    }

}
/*
运行结果:
王XX视察围巾公司转型成小短裙后的情况:
小短裙正在生产了一大波……
夏天来了!小短裙正在热卖……
小短裙在夏天很赚钱……
*/ 

 
 这里ScarfComputerToSkirts多了个有参构造函数,其目的是要继承的子类都必选重写自己的有参构造函数,把产品类传递进来。ScarfComputer类和ScarfComputerToSkirts类的区别是在构造函数上,ScarfComputer类比较明确,只要Scarf, 一个类尽可能少的承担职责,既然ScarfComputer类已经非常明确只生产Scarf产品,那我要生产Skirts怎么办呢?ScarfComputerToSkirts就可以解决问题,它是生产什么类型是由构造函数的参数决定的。我要生产Skirts,那么我就给它new一个Skirts,当然也可以new一个Scarf,这里就不罗嗦了! 

小结一下:换个新鲜点的直接画个图吧!



Computer2(Product product)充分实现了公司和产品之间的关心,有了它再也不用担心公司转型有多麻烦了!夏天生产小短裙Skirts,冬天还是依旧生产Scarf,这个只需要继承products,然后ScarfComputer(Scarf scarf)就OK了!桥接模式的优点也就一目了然。继承不能说它不好,但是有缺点的,为了扬长避短,对于比较明确不发生变化的,则通过继承来完成,若不能确定是否会发生变化的,那就认为是会发生变化,则通过桥梁模式来解决。

下载源码:http://download.youkuaiyun.com/detail/github_22022001/8328823








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值