王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