目录
桥接模式:用于系统的初步设计,对于存在两个独立变化维度的类可以将其分为抽象化和实现化两个角色,使它们可以分别进行变化
对象结构型模式
定义:
桥接模式:将抽象部分与它的实现部分解耦,使得两者都能够独立变化。
毛笔例子实现:
//接口类Color
public interface Color
{
public void bepaint(String penType, String name);
}
//具体类
public class Red implements Color
{
public void bepaint(String penType, String name){
System.out.println(penType + "绿色的" + name);
}
}
后面一样
//抽象类Pen
public abstract Pen
{
protected Color color;
public void setColor(Color color){
this.color = color;
}
public abstract void draw(String name);
}
//具体类
public class BigPen extends Pen
{
public void draw(String name){
String penType = "大号毛笔绘制";
this.color.bepaint(penType, name);
}
}
...后面几个类大同小异就不展示了。
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import java.io.*;
public class XMLUtil
{
//该方法用于从XML配置文件中提取品牌名称,并返回该品牌名称
public static String getBean(String str)
{
try
{
//创建文档对象
DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dFactory.newDocumentBuilder();
Document doc;
doc = builder.parse(new File("config.xml"));
//获取包含类名的文本节点
if(str.equals("color")){
NodeList nl = doc.getElementsByTagName("color");
Node classNode = nl.item(0).getFirstChild();
String name = classNode.getNodeValue().trim();
return name;
}else if(str.equals("pen"){
NodeList nl = doc.getElementsByTagName("pen");
Node classNode = nl.item(0).getFirstChild();
String name = classNode.getNodeValue().trim();
return name;
}
}
catch(Exception e)
{
e.printStackTrace();
return null;
}
}
}
public class Client
{
public static void main(String args[])
{
Color color;
Pen pen;
//利用xml反射读取指定对象
color = (Color)XMLUtil.getBean("color");//看不懂你就理解成color = new Red();
pen= (Pen)XMLUtil.getBean("pen");//看不懂你就理解成pen = new BigPen();
pen.setColor(color);//把桥的另一边设置进来
pen.draw("鲜花");
}
}
<?xml version="1.0"?>
<config>
<color>Red</color>
<pen>BigPen</pen>
</config>
跨平台图片浏览系统:
某软件公司要开发一个跨平台图像浏览系统,要求该系统能够显示BMP、JPG、GIF、PNG等多种格式的文件,并且能够在Windows、Linux、UNIX等多个操作系统上运行。系统首先将各种格式的文件解析为像素矩阵(Matrix),然后将像素矩阵显示在屏幕上,在不同的操作系统中可以调用不同的绘制函数来绘制像素矩阵。另外,系统需具有较好的扩展性,以便在将来支持新的文件格式和操作系统。 试使用桥接模式设计该跨平台图像浏览系统。
桥接和适配器的连用:
桥接模式:用于系统的初步设计,对于存在两个独立变化维度的类可以将其分为抽象化和实现化两个角色,使它们可以分别进行变化
适配器模式:当发现系统与已有类无法协同工作时
桥接模式优点:
- 分离抽象接口及其实现部分
- 可以取代多层继承方案,极大地减少了子类的个数
- 提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,不需要修改原有系统,符合开闭原则
桥接模式缺点:
- 会增加系统的理解与设计难度,由于关联关系建立在抽象层,要求开发者一开始就针对抽象层进行设计与编程
- 正确识别出系统中两个独立变化的维度并不是一件容易的事情
桥接模式适用环境:
- 需要在抽象化和具体化之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系
- 抽象部分和实现部分可以以继承的方式独立扩展而互不影响
- 一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立地进行扩展
- 不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统