应用适配器模式实现通用的数据库访问的程序代码示例

合集下载

C#.net操作数据库通用类

C#.net操作数据库通用类

C#.NET操作数据库通用类(MS SQL Server篇)下面给出了一个C#操作MS SQL Server 数据库的通用类,通过该类可以对数据库进行任何操作,包括执行SQL语句、执行存储过程。

以下是其详细实现过程,希望大家共同修改优化之。

稍后将介绍如何使用它实现N层的程序设计。

配置web.config文件的链接参数<appSettings><!--connStr参数设置,事例说明:(1)Sql server数据库,例如“server=local;database=test;uid=sa;pwd=;”(2)Access数据库,例如“data\ex.mdb; user id='admin';JetOLEDB:database password='admin';” --><add key="connStr" value="server=127.0.0.1;database=DbName;uid=sa;pwd=;" /></appSettings>C#代码using System;using System.Data;using System.Data.SqlClient;namespace Com.LXJ.Database{/// <summary>/// ConnDB的摘要说明。

/// </summary>public class ConnDB{protected SqlConnection Connection;private string connectionString;/// <summary>/// 默认构造函数/// </summary>public ConnDB(){string connStr;connStr = System.Configuration.ConfigurationSettings.AppSettings["connStr"].ToString(); connectionString = connStr;Connection = new SqlConnection(connectionString);}/// <summary>/// 带参数的构造函数/// </summary>/// <param name="newConnectionString">数据库联接字符串</param>public ConnDB(string newConnectionString)connectionString = newConnectionString;Connection = new SqlConnection(connectionString);}/// <summary>/// 完成SqlCommand对象的实例化/// </summary>/// <param name="storedProcName"></param>/// <param name="parameters"></param>/// <returns></returns>private SqlCommandBuildCommand(string storedProcName,IDataParameter[] parameters) {SqlCommand command = BuildQueryCommand(storedProcName,parameters);command.Parameters.Add(new SqlParameter("ReturnValue",SqlDbType.Int,4,ParameterDirection.ReturnValue,false,0,0,string.Em pty,DataRowVersion.Default,null));return command;}/// <summary>/// 创建新的SQL命令对象(存储过程)/// </summary>/// <param name="storedProcName"></param>/// <param name="parameters"></param>/// <returns></returns>private SqlCommandBuildQueryCommand(string storedProcName,IDataParameter[] parameters){SqlCommand command = new SqlCommand(storedProcName,Connection);mandType = CommandType.StoredProcedure;foreach (SqlParameter parameter in parameters){command.Parameters.Add(parameter);}return command;}/// <summary>/// 执行存储过程,无返回值/// </summary>/// <param name="storedProcName"></param>/// <param name="parameters"></param>public void ExecuteProcedure(string storedProcName,IDataParameter[] parameters)Connection.Open();SqlCommand command;command=BuildQueryCommand(storedProcName,parameters);command.ExecuteNonQuery();Connection.Close();}/// <summary>/// 执行存储过程,返回执行操作影响的行数目/// </summary>/// <param name="storedProcName"></param>/// <param name="parameters"></param>/// <param name="rowsAffected"></param>/// <returns></returns>public intRunProcedure(string storedProcName,IDataParameter[] parameters,outintrowsAffected){int result;Connection.Open();SqlCommand command = BuildCommand(storedProcName,parameters);rowsAffected = command.ExecuteNonQuery();result = (int)command.Parameters["ReturnValue"].Value;Connection.Close();return result;}/// <summary>/// 重载RunProcedure把执行存储过程的结果放在SqlDataReader中/// </summary>/// <param name="storedProcName"></param>/// <param name="parameters"></param>/// <returns></returns>public SqlDataReaderRunProcedure(string storedProcName,IDataParameter[] parameters) {SqlDataReaderreturnReader;Connection.Open();SqlCommand command = BuildQueryCommand(storedProcName,parameters); mandType = CommandType.StoredProcedure;returnReader = command.ExecuteReader(CommandBehavior.CloseConnection);return returnReader;}/// <summary>/// 重载RunProcedure把执行存储过程的结果存储在DataSet中和表tableName为可选参数/// </summary>/// <param name="storedProcName"></param>/// <param name="parameters"></param>/// <param name="tableName"></param>/// <returns></returns>public DataSetRunProcedure(string storedProcName,IDataParameter[] parameters,params string[] tableName){DataSetdataSet = new DataSet();Connection.Open();SqlDataAdaptersqlDA = new SqlDataAdapter();sqlDA.SelectCommand = BuildQueryCommand(storedProcName,parameters);string flag;flag = "";for(int i=0;i<tableName.Length;i++)flag = tableName[i];if (flag!="")sqlDA.Fill(dataSet,tableName[0]);elsesqlDA.Fill(dataSet);Connection.Close();return dataSet;}/// <summary>/// 执行SQL语句,返回数据到DataSet中/// </summary>/// <param name="sql"></param>/// <returns></returns>public DataSetReturnDataSet(string sql){DataSetdataSet=new DataSet();Connection.Open();SqlDataAdaptersqlDA=new SqlDataAdapter(sql,Connection);sqlDA.Fill(dataSet,"objDataSet");Connection.Close();return dataSet;}/// <summary>/// 执行SQL语句,返回DataReader/// </summary>/// <param name="sql"></param>/// <returns></returns>public SqlDataReaderReturnDataReader(String sql){Connection.Open();SqlCommand command = new SqlCommand(sql,Connection); SqlDataReaderdataReader = command.ExecuteReader(); returndataReader;}/// <summary>/// 执行SQL语句,返回记录数/// </summary>/// <param name="sql"></param>/// <returns></returns>public intReturnRecordCount(string sql){intrecordCount = 0;Connection.Open();SqlCommand command = new SqlCommand(sql,Connection); SqlDataReaderdataReader = command.ExecuteReader();while(dataReader.Read()){recordCount++;}dataReader.Close();Connection.Close();returnrecordCount;}/// <summary>/// 执行SQL语句/// </summary>/// <param name="sql"></param>/// <returns></returns>public boolEditDatabase(string sql){boolsuccessState = false;Connection.Open();SqlTransactionmyTrans = Connection.BeginTransaction(); SqlCommand command = new SqlCommand(sql,Connection,myTrans); try{command.ExecuteNonQuery();mit();successState = true; }catch{myTrans.Rollback(); }finally{Connection.Close(); } returnsuccessState; }/// <summary>/// 关闭数据库联接/// </summary> public void Close() {Connection.Close(); }}//end class}//end namespace。

asp.net通用的连接数据库实例代码

asp.net通用的连接数据库实例代码

通⽤的连接数据库实例代码View Code复制代码代码如下:<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <center><h2><font face="宋体">访问数据库的通⽤代码实例</font></h2></center><body><form id="form1" runat="server"><div><font face="宋体"><p align="center">1.请输⼊相应数据库连接字符串</p><p align="center"><asp:TextBox id="ConnStrTextBox" runat="server" Width="600"></asp:TextBox></p><p align="center">2.请输⼊相应SQL查询命令语句</p><p align="center"><asp:TextBox id="SqlTextTextBox" runat="server" Width="600"></asp:TextBox></p><p align="center">3.请选择所连接的数据库类型</p><p align="center"><asp:DropDownList ID="DBDropDownList" runat="server" Width="204px"><asp:ListItem Selected="True">Access</asp:ListItem><asp:ListItem>SQLServer</asp:ListItem><asp:ListItem>Oracle</asp:ListItem><asp:ListItem>DB2</asp:ListItem></asp:DropDownList></p><p align="center"><asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="通⽤数据库连接代码测试" /></p><p align="center"><asp:Label id="lblMessage" runat="server" Font-Bold="True" ForeColor="Red"></asp:Label></p></form></font></div>页⾯复制代码代码如下:using System;using System.Configuration;using System.Data;using System.Linq;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.HtmlControls;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Xml.Linq;public partial class _Default : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){//通⽤数据库连接代码,这⾥以连接Access数据库为测试⽰例if (!IsPostBack){ConnStrTextBox.Text = "Provider=Microsoft.Jet.OLEDB.4.0; Data source=" + Server.MapPath("User.mdb");SqlTextTextBox.Text = "Select COUNT(*) From Info Where Name='⼩顾'";lblMessage.Text = "";}}protected void Button1_Click(object sender, EventArgs e){//定义数据库连接字符串string MyConnectionString = this.ConnStrTextBox.Text;//定义查询操作的SQL语句string MySQL = this.SqlTextTextBox.Text;//定义所要连接的数据库类型为Accessstring MyType = this.DBDropDownList.SelectedValue;System.Data.IDbConnection MyConnection = null;// 根据数据库类型,创建相应的 Connection 对象switch (MyType){//选择的数据库类型为“SQLServer”,创建SqlConnection类数据库连接对象case "SQLServer":MyConnection = new System.Data.SqlClient.SqlConnection(MyConnectionString);break;case "Oracle":MyConnection = new System.Data.OracleClient.OracleConnection(MyConnectionString);break;//选择的数据库类型为“Access”,创建OleDbConnection类数据库连接对象case "Access":MyConnection = new System.Data.OleDb.OleDbConnection(MyConnectionString);break;//选择的数据库类型为“DB2”,创建OleDbConnection类数据库连接对象case "DB2":MyConnection = new System.Data.Odbc.OdbcConnection(MyConnectionString);break;default:MyConnection = new System.Data.OleDb.OleDbConnection(MyConnectionString);break;}Execute(MyConnection, MySQL);}public void Execute(System.Data.IDbConnection MyConnection, string strquery){//使⽤ CreateCommand() ⽅法⽣成 Command 对象System.Data.IDbCommand MyCommand = MyConnection.CreateCommand();//执⾏定义的SQL查询语句mandText = strquery;try{//打开数据库连接MyConnection.Open();//定义查询的结果信息String MyInfo = "测试连接成功!符合查询要求的记录共有:" + MyCommand.ExecuteScalar().ToString() + "条!"; //输出查询结果信息lblMessage.Text = MyInfo;}catch (Exception ex){//输出错误异常Response.Write(ex.ToString());}finally{//关闭数据库连接MyConnection.Close();}}}本段程序的核⼼代码为复制代码代码如下://选择的数据库类型为“SQLServer”,创建SqlConnection类数据库连接对象case "SQLServer":MyConnection = new System.Data.SqlClient.SqlConnection(MyConnectionString);break;case "Oracle":MyConnection = new System.Data.OracleClient.OracleConnection(MyConnectionString); break;//选择的数据库类型为“Access”,创建OleDbConnection类数据库连接对象case "Access":MyConnection = new System.Data.OleDb.OleDbConnection(MyConnectionString);break;//选择的数据库类型为“DB2”,创建OleDbConnection类数据库连接对象case "DB2":MyConnection = new System.Data.Odbc.OdbcConnection(MyConnectionString);break;default:MyConnection = new System.Data.OleDb.OleDbConnection(MyConnectionString);break;如果你要其它连接我们还可以增加⼀些连接代码哦。

万能数据库连接程序!

万能数据库连接程序!
DBPath = "SourceDB=" & Server.MapPath( Directory )
Set GetDbfConnection = GetConnection( Driver & SourceType & DBPath )
End Function
'---------------------------------------------------
Set GetSQLServerConnection = conn
End Function
'---------------------------------------------------
Function GetMdbRecordset( FileName, Source )
Params = Params & ";Password=" & Password
Params = Params & ";Initial Catalog=" & Db
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open Params
DBPath = "SourceDB=" & Server.MapPath( FileName )
Set GetDbcConnection = GetConnection( Driver & SourceType & DBPath )
End Function
'---------------------------------------------------

跟我学VS#语言编程技术——应用数据适配器DataAdapter组件实现对数据库表中的数据进行访问操作的应用示例

跟我学VS#语言编程技术——应用数据适配器DataAdapter组件实现对数据库表中的数据进行访问操作的应用示例

1.1跟我学VS#语言编程技术——应用数据适配器DataAdapter组件实现对数据库表中的数据进行访问操作的应用示例1、DataAdapter对象(数据适配器)在.NET中提供了一个非常方便的对象----DataAdapter对象。

在DataAdapter对象中自动连接数据库(Conniction),并且内置了Command和自动生成SQL语句,这就使DataAdapter 对象的功能异常强大,在DataAdapter对象中使用DataReader对象,更重要的,它建立了和DataSet对象的连接,所以,在.NET数据库应用中,应该尽可能的使用DataAdapter对象。

(1)加入一个DataAdapter对象,系统会自动给出一个连接向导,根据向导建立连接。

选择现有的连接(2)在查询生成器中生成SQlS语句(3)如果需要对数据进行修改,则应该点击“高级选项”按钮完成以后,我们可以看到,系统自动加入了一个OleDbConnection1。

(4)也可以重新配置DataAdapter。

(5)再加入一个按钮,并在其事件中加入如下的代码:private void button4_Click(object sender, System.EventArgs e){ string rowDataString;int totalFieldCounter;System.Data.SqlClient.SqlDataReader sqlDataReader;listBox1.Items.Clear();checkedListBox1.Items.Clear();//打开sqlDataAdapter1.SelectCommand.Connection,准备建立DataReader对象sqlDataAdapter1.SelectCommand.Connection.Open();//利用SelectCommand.ExecuteReader来创建DataReader对象//注意这个枚举类型的选项,关闭Connection的连接。

连接数据库代码实例

连接数据库代码实例

连接数据库代码实例连接数据库代码实例1,连接数据库代码文件名称conn.asp所有访问数据库的文件都调用此文件!--#include file=\"Conn.asp\"--%db=\"data/data.mdb\"\'数据库存放目录on error resume next setconn=server.createobject(\"adodb.connection\")conn.open\"driver={micr osoft access driver(*.mdb)};dbq=\"&server.mappath(db)if err then err.clear set conn=Nothing response.write\"数据库连接出错,请检查conn.asp中的连接字符串。

\"response.end end if function CloseDB Conn.Close set Conn=Nothing End Function%%dim badwordbadword=\"\'|and|select|update|chr|delete|%20from|;|insert|mid|master.|set|chr(37)|=\"if request.QueryString\"\"thenchk=split(badword,\"|\")for each query_name in request.querystringfor i=0 to ubound(chk)ifinstr(lcase(request.querystring(query_name)),chk(i))0 then response.write\"script language=javascript alert(\'传参错误!参数\"&query_name&\"的值中包含非法字符串!\n\n\');location=\'\"&request.ServerVariables(\"HTTP_REFERER\")&\"\'/Script\" response.end end if next next end if%--2。

设计模式应用实例

设计模式应用实例

设计模式应用实例在软件开发中,设计模式是解决特定问题的经过验证的方法。

它们是从过去成功的解决问题的经验中提取出来的,可以用于各种情况下的软件设计和开发。

本文将介绍一些常见的设计模式,并通过实例展示它们在实际项目中的应用。

1. 单例模式单例模式是一种最简单的设计模式,它保证一个类只有一个实例,并提供了一个全局访问点。

这个模式适用于某些场景下只需要一个对象来协调行为。

在实际开发中,单例模式可以用于全局配置对象、数据库连接对象、线程池等场景。

下面是一个单例模式的应用示例:singleton.py```pythonclass Config(object):def __init__(self):# load config data from filepassdef get(self, key):# get value of the key from config datapass_config = Nonedef get_config():global _configif _config is None:_config = Config()return _config```在上面的示例中,Config 类的对象只需要创建一次,所以可以使用单例模式。

get_config 函数用来获取单例的 Config 对象,如果还没有创建,则创建一个。

2. 工厂模式工厂模式是一种创建型模式,它提供了一种创建对象的最佳方式,为客户端隐藏了对象的实现细节,并由工厂对象负责创建对象。

工厂模式可以通过减少代码重复和确保工厂生成的对象符合开放封闭原则来简化代码和提高可维护性。

在实际开发中,工厂模式可以用于创建各种对象,例如不同数据库类型的连接对象、不同操作系统的 GUI 组件等。

下面是一个简单的工厂模式的应用示例:factory.py```pythonclass Car(object):def __init__(self, name): = nameclass CarFactory(object):def __init__(self):self.cars = {}def create_car(self, name):if self.cars.get(name):return self.cars[name]car = Car(name)self.cars[name] = carreturn car```在上面的示例中,Car 类表示汽车对象,CarFactory 类用来创建汽车对象。

应用适配器模式实现通用的数据库访问的程序代码示例

应用适配器模式实现通用的数据库访问的程序代码示例

应用适配器模式实现通用的数据库访问的程序代码示例杨教授大学堂精心创作的优秀程序员职业提升必读系列资料应用适配器模式实现通用的数据库访问的程序代码示例1.1.1 GoF适配器模式主要技术特性1、为什么要提供变压器(适配器,Adapter)模式(1)在进行系统集成时经常遇到的问题是接口不一致——接口不匹配很多能满足应用功能的软件系统中的功能模块,由于接口不同,而导致无法使用。

比如,常见的媒体播放器软件有微软的Media Player和另一个媒体播放器软件RealNetworks 公司的RealPlay。

但由于它们的接口完全不同和主持不同的音频和视频格式——前者支持WMF格式的音频和视频,而后者支持RM格式的音频和视频。

(2)如何解决接口不匹配的问题如果开发人员希望自己的应用系统中能使用相同的方式来支持这两种播放器,就需要提供一个相互“适配”的转换接口——也就是可以应用适配器模式解决这个问题。

该适配器类可以将WMF格式的音频和视频转换为RM格式的音频和视频,从而可以重用RealPlay的媒体播放器软件;当然,该适配器类也可以将RM格式的音频和视频转换为WMF格式的音频和视频,从而可以重用Media Player的媒体播放器软件。

(3)什么是适配器模式GOF在他们的设计模式一书中对适配器模式的描述如下:将一个类的接口转换成客户希望的另外一个接口。

适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

其实上面的定义核心思想:在新接口和老接口之间进行适配。

2、适配器模式的主要作用(1)匹配不同接口的程序类适配器模式可以使得原本由于接口不兼容而不能一起工作的类可以一起工作,通过提供适配器类可以实现将一种“接口”转换为另一种“接口”,以满足目标“接口”的应用要求和重用原有的功能实现的程序代码。

由于适配器提供了一种“转换”,使得可以复用一个接口不再符合目前应用需求的已存在的功能类,也可以使一个程序类在发生不可预见的变化时,仅仅影响适配器程序类本身而不影响使用适配器程序类的不同的客户端程序类——将分散的或者发散的可变性集中在某处,有利于程序代码的维护修改。

适配器模式在跨平台应用程序中的应用

适配器模式在跨平台应用程序中的应用

适配器模式在跨平台应用程序中的应用适配器模式是一种常用的设计模式,在跨平台应用程序中也经常被使用。

跨平台应用程序是指能够运行在多个不同的操作系统或设备上的应用程序。

由于不同的操作系统或设备具有不同的接口和功能,所以在开发跨平台应用程序时,需要进行接口适配。

例如,假设我们要开发一款跨平台的音频播放器应用程序。

不同的操作系统可能支持不同的音频格式,比如Windows可能支持WMA格式,而Mac可能支持AAC格式。

我们需要一种机制来使得我们的应用程序能够在不同的操作系统上使用不同的音频格式。

这时,我们可以使用适配器模式。

我们可以定义一个统一的音频播放器接口,然后为每个操作系统创建适配器,将特定操作系统的音频播放器接口转换成统一的音频播放器接口。

这样在编写应用程序时,就可以使用统一的音频播放器接口来进行操作,而不需要关心不同操作系统的细节。

其中一个适配器的实现可能如下所示:```javapublic class WindowsAudioPlayerAdapter implements AudioPlayerprivate WindowsAudioPlayer windowsAudioPlayer;public WindowsAudioPlayerAdapter(WindowsAudioPlayer windowsAudioPlayer)this.windowsAudioPlayer = windowsAudioPlayer;}public void play(String audioFile)windowsAudioPlayer.playWindowsAudio(audioFile);}public void pauswindowsAudioPlayer.pauseWindowsAudio(;}public void stowindowsAudioPlayer.stopWindowsAudio(;}```在应用程序中,我们可以通过创建适配器实例,使用统一的接口来播放音频文件,而不需要关心具体的操作系统:```javaAudioPlayer audioPlayer;//判断操作系统if (currentOS == "Windows")WindowsAudioPlayer windowsAudioPlayer = new WindowsAudioPlayer(;audioPlayer = newWindowsAudioPlayerAdapter(windowsAudioPlayer);} else if (currentOS == "Mac")MacAudioPlayer macAudioPlayer = new MacAudioPlayer(;audioPlayer = new MacAudioPlayerAdapter(macAudioPlayer);audioPlayer.play("music.mp3");```适配器模式在跨平台应用程序中的应用不仅仅局限于处理不同的接口,还可以用于处理不同的数据格式,不同的网络协议等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
由于适配器提供了一种“转换”,使得可以复用一个接口不再符合目前应用需求的已存 在的功能类,也可以使一个程序类在发生不可预见的变化时,仅仅影响适配器程序类本身 而不影响使用适配器程序类的不同的客户端程序类——将分散的或者发散的可变性集中在 某处,有利于程序代码的维护修改。
杨教授大学堂,版权所有,盗版必究。 1/16 页
总体对象内组合多个不同的其它对象。因此,对象适配器可以适配多个不同的原有系统中 的组件接口——从而达到将多个不同的接口统一转换调配为一个共同的接口。下面的示图
杨教授大学堂,版权所有,盗版必究。 3/16 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
为应用对象适配器转换调配多个不同的功能接口的程序类示图。
象”的接口(ObjectDAO)以及它的实现类(ObjectDAOImpl),由于是对 Object 进行操作, 所以任何具体的类(如 Student,,Teacher,User 等)对它都可以适用,下面为接口及对应 的实现类的代码示例。 (1)ObjectDAO 接口及相关的方法的代码示例 import java.util.List; public interface ObjectDAO {
分方法:
(4)类适配器的应用场合 由于适配器类不仅继承了被适配的某个程序类,同时又实现了需要匹配转换的目标接
口。因此,在适配器程序类中可以访问被适配的某个程序类和目标接口,从而承担起“转 换”的功能。
但这种方式当所应用的语言不支持多重继承的时候(比如 Java 语言)而又需要适配多 个不同的被适配的程序类时,则无法应用该方法。这时可以使用下面将要介绍的对象适配 器。 3、对象适配器的程序结构及应用场合 (1)对象适配器的程序结构
因此,对象适配器可以应用于对多个不同的功能类的“适配”功能,可以弥补类适配 器在不支持多重继承的编程语言(如 Java、C#)的实现不足。 2、类适配器的程序结构及应用场合 (1)程序结构实现的要求
类适配器采用继承方式对一个类继承,同时又实现一个接口的方式来与目标接口进行 匹配。类适配器从功能上基本上与前面的转换适配器相同。 (2)客户所期望的目标接口中的方法比被适配的组件类中的方法还要多
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
应用适配器模式实现通用的数据库访问的程序代码示例
1.1.1 GoF 适配器模式主要技术特性
1、为什么要提供变压器(适配器,Adapter)模式 (1)在进行系统集成时经常遇到的问题是接口不一致——接口不匹配
很多能满足应用功能的软件系统中的功能模块,由于接口不同,而导致无法使用。比 如,常见的媒体播放器软件有微软的 Media Player 和另一个媒体播放器软件 RealNetworks 公司的 RealPlay。但由于它们的接口完全不同和主持不同的音频和视频格式——前者支持 WMF 格式的音频和视频,而后者支持 RM 格式的音频和视频。 (2)如何解决接口不匹配的问题
GOF 在他们的设计模式一书中对适配器模式的描述如下:将一个类的接口转换成客户希 望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一 起工作。
其实上面的定义核心思想:在新接口和老接口之间进行适配。 2、适配器模式的主要作用 (1)匹配不同接口的程序类
适配器模式可以使得原本由于接口不兼容而不能一起工作的类可以一起工作,通过提 供适配器类可以实现将一种“接口”转换为另一种“接口”,以满足目标“接口”的应用要 求和重用原有的功能实现的程序代码。
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
(2)重用接口不匹配的现有程序类 实现将两个或者多个没有关系(或者不兼容)的类组合在一起使用,并向客户端提供一
个新的统一的功能服务接口,从而达到重用接口不匹配的现有程序类的目标。 (3)重用接口不匹配的第三方的组件
在应用开发中,经常需要重用第三方的组件,但在应用中却发现该第三方组件的接口 定义和自己应用中所需要的接口定义存在差别,但又不希望修改自己的功能接口和有必要 使用第三方组件接口的功能方法。
对象适配器的程序结构的主要特点是在配器类中采用对象组合(作为配器类中的成员 属性)的方式实现——通过继承一个类(或者实现一个接口),同时再包含另一个类的对象 来实现对多个功能类的适配。下图为对象适配器中转换调配单个接口的程序结构示图。
(2)对象适配器的应用场合 对象适配器中的适配器组件类由于采用对象组合的程序结构,而对象组合可以在一个
如果开发人员希望自己的应用系统中能使用相同的方式来支持这两种播放器,就需要 提供一个相互“适配”的转换接口——也就是可以应用适配器模式解决这个问题。该适配 器类可以将 WMF 格式的音频和视频转换为 RM 格式的音频和视频,从而可以重用 RealPlay 的媒体播放器软件;当然,该适配器类也可以将 RM 格式的音频和视频转换为 WMF 格式 的音频和视频,从而可以重用 Media Player 的ห้องสมุดไป่ตู้体播放器软件。 (3)什么是适配器模式
1.1.2 适配器模式的程序结构
1、适配器模式的两种实现形式 (1)类适配器
只为某个特定的功能类进行转换和匹配的“适配”功能,不适合于对多个不同的功能 类的“适配”功能。 (2)对象适配器
在 Java 语言(当然,也包括 C#语言)中由于不支持多重继承关系,因此如果需要转换 和匹配多个不同的源接口时,类适配器将不再适合应用的需要(因为采用继承关系),此时 可以应用对象适配器(采用对象组合关系)。
(3)对象适配器更优于类适配器 在类适配方式中,是采用继承的方式实现适配行为,类适配器类紧密依赖于被适配的
类;而对象适配器类不再依赖于被适配的类,能够更好地实现松耦合;推荐应用对象适配 器,而少用类适配器。
1.1.3 应用适配器模式实现通用的数据库访问的程序代码示例
1、数据库操作的“抽象”接口和实现类 首先,为了使访问数据库操作的类能达到尽可能的重用,设计和实现了一个比较“抽
下面的示例图为客户所期望的目标接口中的方法比原来的被适配的组件类还要多,其结 构示图如下。
杨教授大学堂,版权所有,盗版必究。 2/16 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
(3)客户所期望的目标接口中的方法比被适配的组件类中的方法还要少 而下面的示图为客户所期望的目标接口中的方法只是原来的被适配的组件类中的一部
相关文档
最新文档