继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

你也对桥接设计模式懵逼了?

随缘清风
关注TA
已关注
手记 15
粉丝 8
获赞 218

时隔3天我又来发表文章了,这次发表桥接模式的。
这里我就引用下概念:将抽象部分与实现部分分离,使它们都可以独立的变化。

当看到这句话是我就懵逼了,不知道如何理解它,让这句话变成自己的东西。╮(╯╰)╭只能看别人写的代码来理解它了,幸好经过我的刻苦,发扬不到黄河心不死的精神终于让我看到了曙光,把桥接模式的概念变成自己的东西了。

下面说说自己的理解:(可能会有些多,希望别嫌我啰嗦)

假设你手里有多个(这个数量方面让我纠结好一阵,写【两个】还是写【多个】,两个太过于局限,因为我看到的demo都是两个多变功能需求)功能有无限次数的变化(变化就是这个功能的需求,也就是这个类中有多个method,而类就是功能,)而你发现在这些功能中或多或少和其他功能有些关联,也就是有条绳子在牵着它(这个请读者自己想象);举个例子(网上看到的)路和汽车,路有高速公路、市中心街道、土路、水泥路。。。等等,汽车有SUV,奥迪、宝马、福特各大品牌的车子,而这条绳子是什么,跑(run)汽车在路上跑;还有个例子,我要把在不同数据库查询出来的内容写到不同文件中去,其中内容是这条绳子,功能不同数据库和不同文件,变化那得看有什么需求了,写到这里估计读者(你)也明白了点吧!回过头来,再说说概念上的那句“抽象部分”和“实现部分”,八个词最重要的只有四个“抽象”和“实现”,顾名思义“实现”嘛,有接口就有实现。拿我举的例2来说,“不同数据库和不同文件”这个两个功能谁当被实现的接口都没关系;最后一个“抽象”,当我理解完桥接模式后就想到为什么要用抽象类来写另一个功能,为啥不能用上一个方式(接口)来写,然后根据这个问题我进行了思考,想到了抽象类和接口在java中的特性,当用抽象类的功能下有多个变化,被继承抽象类的子类或许不需要这些新增加的变化,那么这样用抽象类就解释通了(解释错误之处,请读者下评论中指出来,小弟在此谢谢了)或许有的读者会想说,接口也行啊,请记住一点
做咱们这一行的能简单的决不复杂化,能偷懒的100%会偷赖,这是我给有疑问读者的解答。

说了这么多,其实我也烦了,该放代码出来了,此代码我是根据例2写的,我会尽可能的在代码中解释我所理解的桥接模式,先放张图(UML,第一次画,勿喷)
图片描述

放代码

package com.david.zookerper.Bridge;

/**
 * 数据库接口
 * Created by david on 2016/8/4.
 */
public interface DBInterface {
    /**
     * 打开数据库连接
     */
    public void openDBConnection();

    public String  putContent();

    /**
     * 关闭数据库连接
     */
    public void closeDBConnection();
}

不同数据库的实现,也就是我说的被实现接口的类

package com.david.zookerper.Bridge.impl;

import com.david.zookerper.Bridge.DBInterface;

/**
 * Created by david on 2016/8/4.
 */
public class MySqlDB implements DBInterface {

    @Override
    public void openDBConnection() {
        System.out.println("连接mysql数据库成功");
    }

    @Override
    public String putContent() {
        return "在mysql数据库中查询出来的数据";
    }

    @Override
    public void closeDBConnection() {
        System.out.println("关闭mysql数据库成功");
    }
}
package com.david.zookerper.Bridge.impl;

import com.david.zookerper.Bridge.DBInterface;

/**
 * Created by david on 2016/8/4.
 */
public class OracleDB implements DBInterface {
    @Override
    public void openDBConnection() {
        System.out.println("连接Oracle数据库成功");
    }

    @Override
    public String putContent() {
        return "在Oracle数据库中查询出来的数据";
    }

    @Override
    public void closeDBConnection() {
        System.out.println("关闭Oracle数据库成功");
    }
}
package com.david.zookerper.Bridge.impl;

import com.david.zookerper.Bridge.DBInterface;

/**
 * Created by david on 2016/8/4.
 */
public class SqlServerDB implements DBInterface {

    @Override
    public void openDBConnection() {
        System.out.println("连接SqlServer数据库成功");
    }

    @Override
    public String putContent() {
        return "在SqlServer数据库中查询出来的数据";
    }

    @Override
    public void closeDBConnection() {
        System.out.println("关闭SqlServer数据库成功");
    }

}

看到这里的读者可能回想,连接各大数据库的代码呢?怎么会是一段控制台输出代码,我在这里只能抱歉了,我这是解释桥接模式,不是各大数据库连接总结文章,
下面是抽象类了

package com.david.zookerper.Bridge;

/**
 * Created by david on 2016/8/4.
 */
public abstract class ContentFormat {

    protected DBInterface dbInterface;

    public ContentFormat(DBInterface dbInterface){
        this.dbInterface = dbInterface;
    }

    public void selectLoadContentFile(){
        System.out.println("默认在控制台输入");
    }
}

抽象类中的方法就是我理解中的变化。
抽象类的子类来喽!

package com.david.zookerper.Bridge.extendsClass;

import com.david.zookerper.Bridge.ContentFormat;
import com.david.zookerper.Bridge.DBInterface;

/**
 * Created by david on 2016/8/5.
 */
public class PDFContentFormat extends ContentFormat {

    public PDFContentFormat(DBInterface dbInterface) {
        super(dbInterface);
    }

    @Override
    public void selectLoadContentFile() {
        dbInterface.openDBConnection();
        System.out.println(dbInterface.putContent());
    }
}
package com.david.zookerper.Bridge.extendsClass;

import com.david.zookerper.Bridge.ContentFormat;
import com.david.zookerper.Bridge.DBInterface;

/**
 * Created by david on 2016/8/5.
 */
public class TxtContentFormat extends ContentFormat {

    public TxtContentFormat(DBInterface dbInterface) {
        super(dbInterface);
    }

    @Override
    public void selectLoadContentFile() {
        dbInterface.openDBConnection();
        System.out.println(dbInterface.putContent());
    }
}
package com.david.zookerper.Bridge.extendsClass;

import com.david.zookerper.Bridge.ContentFormat;
import com.david.zookerper.Bridge.DBInterface;

/**
 * Created by david on 2016/8/5.
 */
public class WrodContentFormat extends ContentFormat {

    public WrodContentFormat(DBInterface dbInterface) {
        super(dbInterface);
    }

    @Override
    public void selectLoadContentFile() {
        dbInterface.openDBConnection();
        System.out.println(dbInterface.putContent());
    }
}

最后来个测试的

@Test
    public  void testextendsClass(){
        DBInterface mySqlDB = new MySqlDB();
        DBInterface oracleDB = new OracleDB();
        DBInterface sqlServerDB = new SqlServerDB();
        PDFContentFormat pdfContentFormat = new PDFContentFormat(sqlServerDB);
        pdfContentFormat.selectLoadContentFile();
    }

总结:
到此桥接模式个人理解写完了,希望我的理解能给读我文章的读者有个进一步的理解。
能与读者共勉是我最大的福分!

打开App,阅读手记
2人推荐
发表评论
随时随地看视频慕课网APP