美文网首页设计模式学习小结
设计模式小结-桥接模式

设计模式小结-桥接模式

作者: r09er | 来源:发表于2017-10-12 23:05 被阅读125次

    桥接模式概述

    在画图工具中,有各种不同类型的画笔,也有不同类型的颜色,可以用铅笔画黑色或红色,也可以用钢笔画黑色或红色,其实这个操作背后的设计模式就是桥接模式。如果不适用桥接模式,画4种不同颜色和类型的线,就需要4种比,如果颜色和画笔的种类更多,需要的画笔会指数级增长,这个时候,就需要有桥接模式了。

    示例:

    有一个数据转换工具,可以将数据库中的数据转换成多种文件格式,例如txt、xml、pdf等格式,同时该工具需要支持多种不同的数据库。试使用桥接模式对其进行设计。

    UML图

    示例解析

    在该示例中,有两个独立变化的维度,分别是数据库类型和待转换的文件类型。ExactData是数据库读取数据后解析之后的数据,不同的数据库通过实现ExactDataImpl接口解析具体数据,抽象类AbstractFile持有ExactDataImpl对象,获取解析的数据,提供一个抽象的convetTo方法由子类实现。具体的文件类继承AbstractFile在convertTo进行数据的转换处理。

    示例代码

    数据库读取数据维度

    public  class ExactData {
        //忽略内容
    }
    //数据解析接口
    public interface ExactDataImpl {
        ExactData readFromDB( );
    }
    
    //具体数据库读取接口
    public class MySQLImpl implements ExactDataImpl {
        @Override
        public ExactData readFromDB() {
            System.out.println("MySQL数据读取");
            return new ExactData();
        }
    }
    //具体数据库读取并解析数据
    public class OracleImpl implements ExactDataImpl {
    
        @Override
        public ExactData readFromDB() {
            System.out.println("Oracle数据读取");
            return new ExactData();
        }
    }
    //具体数据库读取并解析数据
    public class DB2Impl implements ExactDataImpl {
    
        @Override
        public ExactData readFromDB() {
            System.out.println("DB2数据读取");
            return new ExactData();
        }
    }
    

    文件生成维度

    //文件生成抽象类
    public abstract class AbstractFile {
        protected ExactDataImpl exactDataImpl;
        public void setExactDataImpl(ExactDataImpl exactDataImpl){
            this.exactDataImpl = exactDataImpl;
        }
        public abstract void convertTo(  );
    }
    //具体文件生成类
    public class PDFFile extends AbstractFile {
        @Override
        public void convertTo() {
            ExactData exactData =  exactDataImpl.readFromDB();
    
            System.out.println("转换为PDF文件");
        }
    }
    //具体文件生成类
    public class TXTFile extends AbstractFile {
        @Override
        public void convertTo() {
            ExactData exactData =   exactDataImpl.readFromDB();
    
            System.out.println("转为TXT文件");
        }
    }
    //具体文件生成类
    public class XMLFile extends AbstractFile {
        @Override
        public void convertTo() {
            ExactData exactData = exactDataImpl.readFromDB();
    
            System.out.println("转换为XML文件");
        }
    }
    

    调用

    
    AbstractFile abstractFile = new TXTFile();
                ExactDataImpl exactDataImpl = new MySQLImpl();
                abstractFile.setExactDataImpl(exactDataImpl);
                abstractFile.convertTo();
    

    输出内容

    
    MySQL数据读取
    转为TXT文件
    

    桥接模式优缺点

    优点

      1. 桥接模式提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统,符合开闭原则
      1. 抽象对象间的关联关系,使得不同的维度可以更加容易组合在一起
      1. 桥接模式可以取代多层继承方案,多层继承方案违背了“单一职责原则”,复用性较差,且类的个数非常多,桥接模式是比多层继承方案更好的解决方法

    缺点

      1. 桥接模式的使用会增加系统的理解与设计难度,由于关联关系建立在抽象层,要求开发者一开始就针对抽象层进行设计与编程。
      1. )桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性,如何正确识别两个独立维度也需要一定的经验积累。

    桥接模式的适用场景

      1. 有两个或多个不同维度,切不同的维度都需要扩展
      1. 不希望使用继承或因为多层继承导致类的个数急剧增加,桥接模式非常适用

    相关文章

      网友评论

        本文标题:设计模式小结-桥接模式

        本文链接:https://www.haomeiwen.com/subject/sffayxtx.html