ASP.NET的适配器设计模式(Adapter)
前天有一网友问及有关设计模式的适配器模式(Adapter)时,说不太好理解。让Insus.NET能否举个简单的例子来说明一下。下面的动画是Insus.NET做出来的效果:
上面的演示,两个灯的规格一样,要求输入的电压为15伏。
Light1是直接使用,而Light2是使用Adapter(电源适配器)。因此Light1只能接收15伏的电压,小于15伏,会提示电压过低,如果超过了15伏,Light1肯定被烧坏。
Light2使用了电源适配器,它接收15伏至220的电压,在这电压范围之内,电源适配器会把电压转为15的电压。小于15伏,会提示电压过低,如果超过了220伏,适配器被烧坏。
好,我们程序开始,先创建一个灯Light的类:
Light.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; /// <summary> /// Summary description for Light /// </summary> namespace Insus.NET { public class Light { private int _InputVoltage = 15 ; public int InputVoltage { get { return _InputVoltage; } set { if (value < 15 ) throw new Exception( " 电压过低。 " ); else if (value > 15 ) throw new Exception( " 危险!电压过大灯烧坏。 " ); else value = 15 ; _InputVoltage = value; } } public Light() { // // TODO: Add constructor logic here // } } }
再创建一个灯的电源适配器:
PowerAdapter.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; /// <summary> /// Summary description for PowerAdapter /// </summary> namespace Insus.NET { public class PowerAdapter : Light { Light _Light; public PowerAdapter(Light light) { this ._Light = light; } public int InputVoltage { get { return _Light.InputVoltage; } set { if (value < 15 ) throw new Exception( " 电压过低。 " ); else if (value > 220 ) throw new Exception( " 危险!电压过大电源适配器烧坏。 " ); else value = 15 ; _Light.InputVoltage = value; } } } }
如何测试它们,我们得模拟一个环境,创建一个网页Default.aspx:
Default.aspx
<% @ Page Language = " C# " AutoEventWireup = " true " CodeFile = " Default.aspx.cs " Inherits = " _Default " %> <! DOCTYPE html > < html xmlns ="http://www.w3.org/1999/xhtml" > < head runat ="server" > < title ></ title > < script type ="text/javascript" > function isNumeric(keyCode) { return ((keyCode >= 48 && keyCode <= 57 ) || keyCode == 8 ) } </ script > </ head > < body > < form id ="form1" runat ="server" > < table > < tr > < td align ="right" > 插座电压 </ td > < td colspan ="2" > < asp:TextBox ID ="TextBox1" runat ="server" onkeydown ="return isNumeric(event.keyCode);" Text ="220" ></ asp:TextBox ></ td > </ tr > < tr > < td align ="right" > 开关 </ td > < td colspan ="2" > < asp:CheckBox ID ="CheckBoxSwitch" runat ="server" AutoPostBack ="true" OnCheckedChanged ="CheckBoxSwitch_CheckedChanged" /></ td > </ tr > < tr > < td align ="right" > 灯 </ td > < td > < fieldset style =" 200px;" > < legend > Light 1 </ legend > < asp:Image ID ="Image1" runat ="server" ImageUrl ="Images/Light_C.gif" Width ="36" Height ="55" />< br /> < asp:Label ID ="Label1" runat ="server" Text ="" ></ asp:Label > </ fieldset > </ td > < td > < fieldset style =" 250px;" > < legend > Light 2 </ legend > < asp:Image ID ="Image2" runat ="server" ImageUrl ="Images/Light_C.gif" Width ="36" Height ="55" />< br /> < asp:Label ID ="Label2" runat ="server" Text ="" ></ asp:Label > </ fieldset > </ td > </ tr > </ table > </ form > </ body > </ html >
接下来,看看开关的事开与关的事件,有详细的注解:
Default.aspx.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using Insus.NET; public partial class _Default : System.Web.UI.Page { string offLight = " ~/Images/Light_C.gif " ; string onLight = " ~/Images/Light_O.gif " ; protected void Page_Load( object sender, EventArgs e) { } protected void CheckBoxSwitch_CheckedChanged( object sender, EventArgs e) { var cb = (CheckBox)sender; // 插座缺少电压为220伏 int input = Convert.ToInt32( string .IsNullOrEmpty( this .TextBox1.Text.Trim()) ? " 220 " : this .TextBox1.Text.Trim()); // 开关打开 if (cb.Checked) { try { // 实例一个电灯 Light light = new Light(); // 插入插座,使用插座电压 light.InputVoltage = input; // 电灯被打开 this .Image1.ImageUrl = onLight; // 显示正常输出电压 this .Label1.Text = light.InputVoltage.ToString(); } catch (Exception ex) { // 如果电压不正常,电灯打不开或是被烧坏。 this .Image1.ImageUrl = offLight; // 显示异常信息。 this .Label1.Text = ex.Message; } try { Light light = new Light(); // 使用电源适配器 PowerAdapter pa = new PowerAdapter(light); pa.InputVoltage = input; this .Image2.ImageUrl = onLight; this .Label2.Text = pa.InputVoltage.ToString(); } catch (Exception ex) { this .Image2.ImageUrl = offLight; this .Label2.Text = ex.Message; } this .TextBox1.Enabled = false ; } // 开关关闭 else { this .TextBox1.Text = string .Empty; this .TextBox1.Enabled = true ; this .Image1.ImageUrl = offLight; this .Image2.ImageUrl = offLight; } } }
11:44分,补充下面内容,有网友问及演示完整代码(.NET Framework 4.0)
http://download.cnblogs.com/insus/ASPDOTNET/AdapterDemo.rar
分类: .NET , Asp.net , C# , Design Pattern , JavaScript
标签: Image , CheckBox , TextBox , Adapter , class , Set , get , Exception , Label , throw , Message
作者: Leo_wl
出处: http://www.cnblogs.com/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息查看更多关于ASP.NET的适配器设计模式(Adapter)的详细内容...