好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

ASP.NET的适配器设计模式(Adapter)

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)的详细内容...

  阅读:38次