桥接模式三维度实例
题目:如果系统中某对象有三个维度,如某日志记录器既可以支持不同的操作系统,还可以支持多种编程语言,并且可以使用不同的输出方式。请使用桥接模式设计该系统。
采用xml文件处理数据方式,以下为代码
import java.io.File;
import javax.xml.parsers.*;
import org.w3c.dom.*;
public class XmlUtil {
//配置文件读取处理类
public static Object getBean(String args)
{
try{
//创建一个文档对象
DocumentBuilderFactory dFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=dFactory.newDocumentBuilder();
Document doc=builder.parse(new File("E:/workplace/Design moddle/Qiaojie.xml"));
//获取包含类名的文本节点
NodeList n1=doc.getElementsByTagName("classname");
Node classnode = null;
String className=null;
if(args.equals("OutPut"))
{
classnode=n1.item(0).getFirstChild();
}else if(args.equals("OperatingSystem"))
{
classnode=n1.item(1).getFirstChild();
}else if(args.equals("EncodingLanguage"))
{
classnode=n1.item(2).getFirstChild();
}
className=classnode.getNodeValue();
//通过类名生成实例对象并将其返回
Class c=Class.forName("test82."+className);
Object obj=c.newInstance();
return obj;
}catch(Exception e)
{
e.getStackTrace();
return null;
}
}
}
接下来xml文件
<?xml version="1.0" encoding="UTF-8"?>
<config>
<classname>FileOut</classname>
<classname>Linux</classname>
<classname>C_yuyan</classname>
</config>
编程语言抽象类EncodingLanguage及它的两个子类
//定义抽象编程语言类
public abstract class EncodingLanguage {
OutPut output;
public void setOuPut(OutPut out)
{
this.output=out;
}
public abstract void language(String system);
}
//定义java语言类
public class Java extends EncodingLanguage{
public void language(String system) {
// TODO Auto-generated method stub
String language="Java语言\n";
this.output.output(system,language);
//System.out.println("java编程!\n");
}
}
//定义c语言类
public class C_yuyan extends EncodingLanguage {
public void language(String system) {
// TODO Auto-generated method stub
String language="c语言";
this.output.output(system, language);
//System.out.println("C语言编程!\n");
}
}
输出抽象类以及它的子类
//定义输出抽象类
public abstract class OutPut {
public abstract void output(String system,String language);
}
//文件输出方式类
public class FileOut extends OutPut{
public void output(String system, String language) {
// TODO Auto-generated method stub
String means="File方式输出";
System.out.println("在"+system+"用"+language+"以"+means);
}
}
//控制台输出类
public class ContrleOut extends OutPut{
public void output(String system, String language) {
// TODO Auto-generated method stub
String means="控制台方式";
System.out.println("在"+system+"用"+language+"以"+means);
}
}
操作系统抽象类和它的子类
//定义抽象操作系统类
public abstract class OperatingSystem {
EncodingLanguage encodinglanguage;
public void setlanguage(EncodingLanguage lang)
{
this.encodinglanguage=lang;
}
public abstract void type();
}
//Windows系统类
public class Windows extends OperatingSystem{
public void type() {
// TODO Auto-generated method stub
String system="windows系统";
this.encodinglanguage.language(system);
//System.out.println("正在使用Windows系统!");
}
}
//Linux操作系统类
public class Linux extends OperatingSystem{
public void type() {
// TODO Auto-generated method stub
String system="Linux系统";
this.encodinglanguage.language(system);
//System.out.println("正在是用Linux系统!");
}
}
客户端测试类
//客户端测试类
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
OutPut output=null;
EncodingLanguage language=null;
//System.out.println(language);
OperatingSystem system=null;
if(output==null && language==null && system==null)
{
output=(OutPut)XmlUtil.getBean("OutPut");
language=(EncodingLanguage)XmlUtil.getBean("EncodingLanguage");
//System.out.println(language);
system=(OperatingSystem)XmlUtil.getBean("OperatingSystem");
//System.out.println(output);
//System.out.println(language);
//System.out.println(system);
}
system.setlanguage(language);
//System.out.println(language);
language.setOuPut(output);
system.type();
}
}
最后运行结果