桥接模式

        桥接模式是一种很实用的结构型设计模式,如果软件系统中某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来,使两者可以独立扩展,让系统更加符合“单一职责原则”。与多层继承方案不同,它将两个独立变化的维度设计为两个独立的继承等级结构,并且在抽象层建立一个抽象关联,该关联关系类似一条连接两个独立继承结构的桥,故名桥接模式。

        开发一个跨平台图像浏览系统,要求该系统能够显示BMP、JPG、GIF、PNG等多种格式的文件,并且能够在Windows、Linux、Unix等多个操作系统上运行

初始设计
在这里插入图片描述
使用桥接模式的设计
在这里插入图片描述
具体的代码如下:

public abstract class Image {
    protected ImageImp imp;
    public void setImageImp(ImageImp imp){
        this.imp = imp;
    }
    public abstract void parseFile(String fileName);
}

public interface ImageImp {
    public void doPaint(String imageType);
}
public class JPGImage extends Image {
    @Override
    public void parseFile(String fileName) {
        imp.doPaint("JPG");
    }
}

public class PNGImage extends Image {
    @Override
    public void parseFile(String fileName) {
        imp.doPaint("PNG");
    }
}
public class BMPImage extends Image {
    @Override
    public void parseFile(String fileName) {
        imp.doPaint("BMP");
    }
}
public class WindowsImp implements ImageImp {

    @Override
    public void doPaint(String imageType) {
        System.out.println("windows paint image,imagtype: "+imageType);
    }
}
public class LinuxImp implements ImageImp {
    @Override
    public void doPaint(String imageType) {
        System.out.println("Linux paint image,imagtype: "+imageType);
    }
}
public class UnixImp implements ImageImp{
    @Override
    public void doPaint(String imageType) {
        System.out.println("unix paint image,imagtype: "+imageType);
    }
}
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 {
    //该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象
    public static Object getBean(String args) {
        try {
            //创建文档对象
            DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = dFactory.newDocumentBuilder();
            Document doc;
            doc = builder.parse(new File("D:\\learnspace\\mytest\\mvctest2\\src\\main\\java\\designpatterns\\bridge\\Config.xml"));
            NodeList nl = null;
            Node classNode = null;
            String cName = null;
            nl = doc.getElementsByTagName("className");
            if (args.equals("image")) {
                //获取第一个包含类名的节点,即扩充抽象类
                classNode = nl.item(0).getFirstChild();
            } else if (args.equals("os")) {
                //获取第二个包含类名的节点,即具体实现类
                classNode = nl.item(1).getFirstChild();
            }
            cName = classNode.getNodeValue();
            //通过类名生成实例对象并将其返回
            Class c = Class.forName(cName);
            Object obj = c.newInstance();
            return obj;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}
<?xml version="1.0"?>
<config>
    <!--RefinedAbstraction-->
    <className>designpatterns.bridge.JPGImage</className>
    <!--ConcreteImplementor-->
    <className>designpatterns.bridge.WindowsImp</className>
</config>
public class Client {
    public static void main(String[] args) {
        Image image = (Image)XMLUtil.getBean("image");
        ImageImp imp = (ImageImp)XMLUtil.getBean("os");;
        image.setImageImp(imp);
        image.parseFile("adsdas");
    }
}
发布了90 篇原创文章 · 获赞 7 · 访问量 7847
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览