多种文件操作类型的抽象(策略模式)

1、业务需求
   两种文件操作功能,比如一种是对共享文件夹的操作,另一种是对svn服务器的操作(使用sharpsvn),
   两种方法包括一些公共的方法(比如新增、修改、删除文件/文件夹,移动文件、判断文件/文件夹是否存在)、
   公共的属性(文件访问路径、访问用户名、密码等),要求用面向对象的方式进行设计
   
   
2、设计思路
   因为两种实现方法有公共的属性和方法,所以考虑使用继承进行共享及抽象,对于公共方法使用接口(Interface)进行抽象,
   对于公共属性使用抽象类(abstract class)进行抽象,其中抽象类继承于接口。然后两种实现方法分别实现抽象类,
   并通过构造函数对抽象类中的公共属性初始化。

 

3、实现代码(部分)

 public interface IFile
    {
        string GetShareType();

        byte[] Read();

        void Write(byte[] content);

        void Move(string sourcePath, string log);

        void Delete();
    }
    
    public abstract class AbstractFile : IShareFile
    {
        protected string filePath;
        protected string username;
        protected string password;
        
        public AbstractFile(string filePath, string username, string password)
        {
            this.filePath = filePath;
            this.username = username;
            this.password = password;
        }

        public abstract string GetShareType();
        
        public abstract byte[] Read();

        public abstract void Write(byte[] content);

        public abstract void Move(string sourcePath, string log);

        public abstract void Delete();
    }
    
    public class SvnFile : AbstractFile
    {
        public SvnFile(string filePath, string username, string password)
            : base(filePath, username, password)
        {
        }
        
        //对方法的具体实现
    }
    
    public class ShareFile : AbstractFile
    {
        public ShareFile(string filePath, string username, string password)
            : base(filePath, username, password)
        {
        }
        
        //对方法的具体实现
    }

 

4、新增策略类

public class FileContext
{

       IFile file=null;
       
       /// <summary>
        /// 根据传入参数初始化实现类(参数可为枚举)
        /// </summary>
        /// <returns></returns>
        public void FileContext(int type)
        {
          if(type==1)
          {
           file= new SvnFile ();
          }
          
          file= new ShareFile ();
        }

        /// <summary>
        /// 调用接口方法
        /// </summary>
        /// <returns></returns>
        public static byte[] Read()
        {
           return file.Read();
        }
}

 

5、客户端调用

FileContext context=new FileContext(1);
context.Read(); //内部自动调用SvnFile.Read()方法

 

posted @ 2014-07-13 15:42    阅读(282)  评论(0编辑  收藏  举报