• 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

  • 相关阅读:
    LoggingApplicationListener
    Repeated meta-data items
    善待Redis里的数据--Unable to validate object
    mysql启动的四种方式
    mybatis操作动态表+动态字段+存储过程
    VMware 11安装Mac OS X 10.10
    JMS开源比较
    VMware 11安装Mac OS X 10.10
    网页设计的标准尺寸
    FullPage.js
  • 原文地址:https://www.cnblogs.com/insus/p/2891426.html
Copyright © 2020-2023  润新知