多种文件操作类型的抽象(策略模式)
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()方法