桥模式:将对摸个问题抽象的不同形式分别于该问题的具体实现部分相互分离,是它们都可以独立的裱花,并且能动态的结合。这个模式是面向对象的接口隔离原则的典型实现和具体的应用。
使用桥模式可以讲对问题的抽象的不同形式与该问题的具体实现部分相互分离,使他们都可以独立的变化--因为桥模式可以提供在各个不同的实现中动态的进行交换,而不必重新编译程序。同时可以向客户端程序隐藏具体实现部分的功能细节。
下图是桥模式的设计思想在Java虚拟机中的具体应用。
Sun公司在设计Java语言是,通过Java虚拟机技术来实现Java类文件的平台无关性。儿虚拟机通过对底层操作系统平台的机器指令集技术局类型等进行统一的抽象,并针对不同的操作系统平台提供不同的虚拟机来满足该操作系统平台下Java类文件的要求。
应用桥模式的UML类图。
桥模式将问题分为问题的抽象和问题的实现了个部分。在一下情况下可以考虑用桥模式。
1)不希望在抽象和实现部分之间有一个固定的绑定关系。
2)类的抽象以及他的实现都可以通过生成子类的方法加以补充。
3)对一个抽象实现部分的修改不会产生对其客户端的影响。
桥模式的具体实现例子如下:
在某个管理系统中,需要对给定的某个字符再进行转换,但是具体的转换要求可能是进行大写转换、小写转换,同时还要求将转换后的结构进行日志输出,而日志输出可能是控制台输出,可能是浏览器输出等。
分离问题的 抽象(字符转换)和问题的实现(日志输出)。
UML类图如下
具体代码如下:
问题的抽象,字符转换抽象类如下:
package birdge;
public abstract class TransferAbstract {
protected OutputResultAbstract output = null;
public String doTransfer(String input, int output_Type) {//模版方法
output = TrasferResultFactory.getOutputResult(output_Type);
String result = doTransfer(input);
output.output(result);
return result;
}
abstract public String doTransfer(String input);//传说中的钩子
} |
日志输出,问题的实现抽象类如下:
public abstract class OutputResultAbstract {
abstract public boolean output(String input);
} |
问题的实现的工厂类,降低耦合性。
package birdge;
public class TrasferResultFactory {
public static final int Control = 1;
public static final int JSPFile = 2;
public TrasferResultFactory() {
}
public static OutputResultAbstract getOutputResult(int type) {
OutputResultAbstract result = null;
switch (type) {
case Control:
result = new Output_Control();
break;
case JSPFile:
result = new Output_JSPFile();
break;
}
return result;
}
} |
字符创转换小写具体实现类
package birdge;
public class Transfer_LowerCase extends TransferAbstract {
public String doTransfer(String input) {
String result = input.toLowerCase();
System.out.println("已经将"+input+"转化为"+result);
return result;
}
} |
字符创转换大写具体实现类
package birdge;
public class Transfer_UpperCase extends TransferAbstract {
public String doTransfer(String input) {
String result = input.toUpperCase();
System.out.println("已经将"+input+"转化为"+result);
return result;
}
} |
想控制台输出日志
package birdge;
public class Output_Control extends OutputResultAbstract {
public boolean output(String input) {
System.out.println("转化结果为:" + input + ",并已进行了日志记录");
return true;
}
} |
想浏览器输出日志
package birdge;
public class Output_JSPFile extends OutputResultAbstract {
public boolean output(String input) {
System.out.println("转化结果为:"+input+",并已想浏览器输出");
return true;
}
} |
测试类。
package birdge;
//这是桥模式及的测试类
public class Test {
public static void main(String[] args) {
TransferAbstract transfer = new Transfer_LowerCase();
String input = "This Is A Test String";
transfer.doTransfer(input, 1);
transfer.doTransfer(input, 2);
transfer = new Transfer_UpperCase();
transfer.doTransfer(input, 1);
transfer.doTransfer(input, 2);
}
} |
结果如下:
|