设计模式 之 创建型模式 <三> 桥接模式(Bridge Pattern )
在桥接模式几个角色:
●Abstraction(抽象类):用于定义抽象类的接口,它一般是抽象类而不是接口,其中定义了 一个Implementor(实现类接口)类型的对象并可以维护该对象,
它与Implementor之间具有关联关系,它既可以包含抽象业务方法,也可以包含具体业务方法。
●RefinedAbstraction(扩充抽象类):扩充由Abstraction定义的接口,通常情况下它不再是抽象类而是具体类,它实现了在Abstraction中声明的抽象业务方法,
在RefinedAbstraction中可以 调用在Implementor中定义的业务方法。
●Implementor(实现类接口):定义实现类的接口,这个接口不一定要与Abstraction的接口完 全一致,事实上这两个接口可以完全不同,一般而言,Implementor接口仅提供基本操作,
而 Abstraction定义的接口可能会做更多更复杂的操作。Implementor接口对这些基本操作进行了声 明,而具体实现交给其子类。
通过关联关系,在Abstraction中不仅拥有自己的方法,还可以调 用到Implementor中定义的方法,使用关联关系来替代继承关系。
●ConcreteImplementor(具体实现类):具体实现Implementor接口,在不同的 ConcreteImplementor中提供基本操作的不同实现,在程序运行时,
ConcreteImplementor对象将 替换其父类对象,提供给抽象类具体的业务操作方法。
练习:Sunny软件公司欲开发一个数据转换工具,可以将数据库中的数据转换成多种文件格式, 例如txt、xml、pdf等格式,同时该工具需要支持多种不同的数据库。
试使用桥接模式对 其进行设计。
1.数据库抽象类
//数据库抽象类 public abstract class AbsDatabase { protected FileFormat fileFormat=null; public AbsDatabase(FileFormat fileFormat){ this.fileFormat=fileFormat; } abstract void convertFile(); }
MySql 具体实现类
//MySql 具体实现类 public class MySqlDatabase extends AbsDatabase { public MySqlDatabase(FileFormat fileFormat) { super(fileFormat); } @Override public void convertFile() { String data=getData(); fileFormat.saveFile(data); } private String getData() { return "返回MySql数据库里面的数据!"; } }
Oracle 具体实现类
//Oracle 具体实现类 public class OracleDatabase extends AbsDatabase { public OracleDatabase(FileFormat format) { super(format); } @Override public void convertFile() { String data=getData(); fileFormat.saveFile(data); } private String getData() { return "返回Oracle数据库里面的数据!"; } }
2.文件格式接口
//文件格式接口 public interface FileFormat { public void saveFile(String data); }
txt 文件格式
public class TxtFormat implements FileFormat { String TAG="TxtFormat"; @Override public void saveFile(String data) { Log.d(TAG,"保持到为txt格式文件!"); } }
xml 文件格式
public class XmlFormat implements FileFormat { String TAG="XmlFormat"; @Override public void saveFile(String data) { Log.d(TAG,"保持到为xml格式文件!"); } }
pdf文件格式
public class PdfFormat implements FileFormat { String TAG="PdfFormat"; @Override public void saveFile(String data) { Log.d(TAG,"保持到为pdf格式文件!"); } }
3. 测试
public void test(){ FileFormat txtFormat=new TxtFormat(); //---------将MySql数据库的数据转换为txt文件--------------- AbsDatabase mySqlDatabase=new MySqlDatabase(txtFormat); mySqlDatabase.convertFile(); //---------将Oracle数据库的数据转换为txt文件--------------- AbsDatabase oracleDatabase=new OracleDatabase(txtFormat); oracleDatabase.convertFile(); //========================================================================== FileFormat xmlFormat=new XmlFormat(); //---------将MySql数据库的数据转换为xml文件--------------- mySqlDatabase=new MySqlDatabase(xmlFormat); mySqlDatabase.convertFile(); //---------将Oracle数据库的数据转换为xml文件--------------- oracleDatabase=new OracleDatabase(xmlFormat); oracleDatabase.convertFile(); //========================================================================== }
浙公网安备 33010602011771号