代理模式初步实践

类别:.NET开发 点击:0 评论:0 推荐:

       以前在一个网站上看到过一篇文件说,有一个很有名的JAVA论坛把所有与后台的管理都写入到一个代理类中,但操作到来时,对只与这个类打交道。后来查了一个设计模式的词典,发现代理模式的定义如下:当需要将一个复杂的对象或创建时比较花费时间的对象表示成一个简单对象时,可以使用代理模式(Proxy Pattern)。如果创建一个对象比较浪费时间或浪费计算机资源,Proxy允许将创建过程推迟到需要该实际对象的时候。Proxy对象通常具有和它所代表的对象一样的方法,一旦对象被调入,就把调用方法从Proxy传递给实际对象。
       由于本人对设计模式只是刚入道不久,为了加深一下理解,特写出与上面论坛中相类似的精简版的代理模式,为了方便,把它们与后台的操作一起封在一个名字空间下,但想必大家都知道这样的后果[实际工作中千万别这样]

文件名:Proxy.cs
using System;
using System.Data.OleDb;
using clubstar.IPlug.DataOp;

namespace clubstar.DataOp
{
 
 /// <summary>
 ///  Authority_Identify_Proxy 的摘要说明。
 ///  权限识别代理类采用PROXY设计模式,当系统管理员对数据表admin进行操作时,
 ///  会通过该代理来进行相关的操作
 /// </summary>
 
 public interface Authority_Identify 
 {
  bool isSystem_Admin(string name,string password);
  bool Change_Name(string name,string password,string newname);
  bool Change_Password(string name,string password,string newpassword) ;
  bool Delete_Admin(string name,string password) ;
  OleDbDataReader Select_Admin(string name,string password) ;
 }
 

 //将会被代理的类
 public class Admin:Authority_Identify
 {
  private ConnDB_Op UserTable=ConnDB_Op.Instance();
  private OleDbDataReader dr;

  private static Admin admin = null;     //采用单体模式进行操作
  public static Admin Instance()
  {
   if (null == admin)
    admin = new Admin();
   return admin;
  }

  public  bool isSystem_Admin(string name,string password)
  {
         dr=UserTable.ExecuteReader("select * from admin where name='"+name.Trim()+"' and password='"+password+"' and rank=1");
   if  (dr.HasRows)
    return true;
   else
    return false;
  }

  public bool Change_Name(string name,string password,string newname)
  {
   if (isSystem_Admin(name,password))
   {
              UserTable.ExecuteReader("update admin set name='"+newname.Trim()+"' where name='"+name.Trim()+"'");
    return true;
   }
   else
   {
    return false;
   }
  }

  public bool Change_Password(string name,string password,string newpassword)
  {
   if (isSystem_Admin(name,password))
   {
              UserTable.ExecuteReader("update admin set password='"+newpassword.Trim()+"' where name='"+name.Trim()+"'");
    return true;
   }
   else
   {
    return false;
   }
  }

  public bool Delete_Admin(string name,string password)
  {
   if (isSystem_Admin(name,password))
   {
              UserTable.ExecuteReader("delect from admin where name='"+name.Trim()+"'");
    return true;
   }
   else
   {
    return false;
   }
  }

  public OleDbDataReader Select_Admin(string name,string password)
  {
   if (isSystem_Admin(name,password))
     dr=UserTable.ExecuteReader("select * from admin where name='"+name.Trim()+"'");
   return dr;
  }
 }


 //代理类:
 public class AdminProxy
 {
  public Admin admin=Admin.Instance();
  public string _name,_password;
  public AdminProxy(string name,string password)
  {
   this._name=name;
   this._password=password;
  }
  /* 管理整个系统的级别 */
  public static  int SYSTEM_ADMIN = 1;
  
  public bool Change_Name(string newname)
  {
            return admin.Change_Name(this._name,this._password,newname.Trim());
  }

  public bool Change_Password(string newword)
  {
   return admin.Change_Password(this._name,this._password,newword);
  }

  public bool Delete_Admin()
  {
   return admin.Delete_Admin(this._name,this._password);
  }

  public OleDbDataReader Select_Admin()
  {
   return admin.Select_Admin(this._name,this._password);
  }

 }

}

实际调用时只需要声明如下即可:
AdminProxy test=new AdminProxy("1","1");
test.Change_Password("1");

本文地址:http://com.8s8s.com/it/it42401.htm