设计模式的艺术 结构性模式之桥接模式

不懂使用为学过,说出用途,绘制结构为了解,不会灵活使用基本等于没学。

前言

了解过画画的人都知道,颜色有很多种,纸也有很多种,但是他们直接怎么连接起来呢??通过笔,来使其灵活生动的转换起来,桥接模式也是这个原理,是一种对象结构型模式

什么是桥接模式  Bridge Pattern

将抽象部分与其实现部分分离,使他们都可以独立的变化,它是一种对象结构型模式,又被称为柄体模式或者接口模式

桥接模式的优点

(1)、分离了抽象接口及其实现部分。桥接模式使用"对象间的关联关系"解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化(既抽象和实现不在同一个继承层次结构中,而是"子类化"它们,使他们各自都有自己的子类,以便任意组合子类,从而获得多维度组合对象)。

(2)、很多情况之下,桥接模式是可以取代多层继承方案。多层继承方案违背了单一职责原则,复用性比较差,且类的个数非常的多,桥接模式是比多层继承方案更好的解决办法,它极大的减少了子类的个数

(3)、桥接模式提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有代码,符合开闭原则

桥接模式的缺点

(1)、桥接模式的使用会增加系统的理解和设计难度,由于关联关系建立在抽象层,要求开发者一开始就针对抽象层进行设计和编程

(2)、桥接模式要求能够正确的识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性,如何正确识别两个独立维度也需要一定的经验的积累。

桥接模式的使用场景

(1)、如果一个系统需要在抽象类和具体类之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系,通过桥接模式可以使他们在抽象层建立一个关联关系

(2)、抽象部分和实现部分可以继承的方式独立扩展而互不影响,在程序运行时可以动态的将一个抽象类子类的对象和一个实现类子类的对象进行组合,即系统需要对抽象角色和实现类角色进行动态耦合

(3)、一个类存在两个或者多个独立的变化的维度,且这两个或者多个维度都需要独立进行扩展

(4)、对于那些不希望使用继承或者因为多层继承导致系统类的个数急剧增加的系统,桥接模式尤为适用

桥接模式的具体实现

在不同的系统中创建不同格式的图片

目录结构

抽象图像类以及具体实现类

package com.company;

public class Matrix {
    
}
package com.company.image;

import com.company.system.ImageImp;

//抽象图像类:抽象类,这是最重要的桥,将img接口放入其中,组合在一起,实现创建不同格式的图片
 public abstract class Images {
     protected ImageImp imp;

    public void setImp(ImageImp imp) {
        this.imp = imp;
    }
    public abstract void parseFile(String fileName);
}
package com.company.image;


import com.company.Matrix;

public class JPGImage extends Images {
    @Override
    public void parseFile(String fileName) {
        //模拟解析JPG文件并获取一个像素矩阵对象M;
        Matrix m=new Matrix();
         imp.doPaint(m);
        System.out.println(fileName+"格式为JPG");
    }
}
package com.company.image;

import com.company.Matrix;

public class PNGImage extends Images{
    @Override
    public void parseFile(String fileName) {
        //解析模拟PNG文件并获得一个像素矩阵对象M
        Matrix m=new Matrix();
        imp.doPaint(m);
        System.out.println(fileName+"格式为PNG");
    }
}

抽象操作系统类以及实现类

package com.company.system;

import com.company.Matrix;

//抽象操作系统实现:实现类接口
public interface ImageImp {
        public void doPaint(Matrix matrix);  //显示像素矩阵matrix
}
package com.company.system;

import com.company.Matrix;

//Linux操作系统实现类:具体实现类
public class LinuxImp implements ImageImp {
    @Override
    public void doPaint(Matrix matrix) {
        //调用Linux系统的绘制函数像素矩阵
        System.out.println("在UNIX操作系统中显示图像");
    }
}
package com.company.system;

import com.company.Matrix;

//UXIX操作系统实现类:具体实现类
public class UnixImp implements ImageImp {
    @Override
    public void doPaint(Matrix matrix) {
            //调用UNIX系统的绘制函数绘制像素矩阵
        System.out.println("在UNIX操作系统中显示图像");
    }
}
package com.company.system;

import com.company.Matrix;

//Windows操作系统实现类:具体实现类
public class WindowsImp implements ImageImp {
    @Override
    public void doPaint(Matrix matrix) {
        //调用Windows系统的绘制函数绘制像素矩阵
        System.out.println("在Windows操作系统中显示图像");
    }
}

工具类

package com.company.util;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;

public class XMLUtil {
    public static Object getBean(String args) {
        try {
            //获取文档对象
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder documentBuiler = documentBuilderFactory.newDocumentBuilder();
            Document document = documentBuiler.parse(new File(XMLUtil.class.getClassLoader().getResource("")
                    .getPath() + "config.xml"));
            //获取节点的value
            NodeList nodeList = document.getElementsByTagName("className");
            Node node = null;
            if (args.equals("com.company.image.JPGImage")) {
                //获取第一个节点
                node = nodeList.item(0).getFirstChild();
            } else if (args.equals("com.company.system.WindowsImp")) {
                //获取第二个节点
                node = nodeList.item(1).getFirstChild();
            }
            String name = node.getNodeValue();
            //生成实例对象将其返回
            Class c = Class.forName(name);
            Object obj = c.newInstance();
            return obj;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

    }
}

客户端测试类

package com.company;

import com.company.image.Images;
import com.company.system.ImageImp;
import com.company.util.XMLUtil;

public class Client {

    public static void main(String[] args) {
   // write your code here
        Images images;
        ImageImp imageImp;
        images=(Images) XMLUtil.getBean("com.company.image.JPGImage");
        imageImp=(ImageImp) XMLUtil.getBean("com.company.system.WindowsImp");
        images.setImp(imageImp);
        images.parseFile("小龙女");
    }
}

转载请注明出处,掌声送给社会人

猜你喜欢

转载自blog.csdn.net/SCDN_CP/article/details/82853790