职责链模式
第一次手写博客,见谅哈。
项目中遇见一个流程处理的问题:
从数据库导出文件,压缩,上传。
项目中实现时,使用了多层 if else嵌套,觉得太不美观。并且不好维护。所以想到了下面这个设计模式。
用来解决原来大量的分支判断造成维护困难,灵活性差的问题。
下面代码仅用于演示。
代码如下:
定义状态枚举
1 public enum FileState 2 { 3 NotExport, 4 Exported, 5 Zip, 6 Upload 7 }
定义基类:
1 public abstract class Hander 2 { 3 protected Hander op; 4 5 public void SetOp(Hander op) 6 { 7 this.op = op; ; 8 } 9 10 public abstract void HandleRequest(FileState request); 11 }
定义子类:
1 public class FileExport : Hander 2 { 3 public override void HandleRequest(FileState request) 4 { 5 if (request == FileState.NotExport) 6 { 7 //执行导出 8 Console.WriteLine("导出成功"); 9 op.HandleRequest(FileState.Exported); 10 } 11 else if (op != null) 12 { 13 op.HandleRequest(FileState.Exported); 14 } 15 else 16 { 17 throw new ArgumentException("参数错误"); 18 } 19 } 20 }
1 public class FileZip : Hander 2 { 3 public override void HandleRequest(FileState request) 4 { 5 if (request == FileState.Exported) 6 { 7 //执行压缩 8 Console.WriteLine("压缩成功"); 9 op.HandleRequest(FileState.Zip); 10 } 11 else if (op != null) 12 { 13 op.HandleRequest(FileState.Zip); 14 } 15 else 16 { 17 throw new ArgumentException("参数错误"); 18 } 19 } 20 }
1 public class FileUpload : Hander 2 { 3 public override void HandleRequest(FileState request) 4 { 5 if (request == FileState.Zip) 6 { 7 Console.WriteLine("上传成功"); 8 } 9 else 10 { 11 throw new ArgumentException("参数错误"); 12 } 13 } 14 }
客户端调用:
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Hander objFileExport = new FileExport(); 6 Hander objFileZip = new FileZip(); 7 Hander objFileUpload = new FileUpload(); 8 objFileExport.SetOp(objFileZip); 9 objFileZip.SetOp(objFileUpload); 10 11 //执行 12 objFileExport.HandleRequest(FileState.NotExport); 13 14 Console.ReadLine(); 15 } 16 }