前天有一网友问及有关设计模式的适配器模式(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)