1. 程式人生 > 其它 >vue-awesome-swiper使用遇到的坑

vue-awesome-swiper使用遇到的坑

責任鏈模式簡介

定義:是一種物件行為模式,為了避免請求傳送者與多個請求處理者耦合在一起,於是將所有請求的處理者通過前一物件記住其下一個物件的引用而連成一條鏈;當有請求發生時,可將請求沿著這條鏈傳遞,直到有物件處理它為止

目標:職責鏈上的處理者負責處理請求,客戶只需要將請求傳送到職責鏈上即可,無須關心請求的處理細節和請求的傳遞,所以職責鏈將請求的傳送者和請求的處理者解耦了

優點:

降低了物件之間的耦合度,使得一個物件無須知道到底是哪一個物件處理其請求以及鏈的結構,傳送者和接收者也無須擁有對方的明確資訊

增強了系統的可擴充套件性,可以根據需要增加新的請求處理類,滿足開閉原則

增強了給物件指派職責的靈活性,當工作流程發生變化,可以動態地改變鏈內的成員或者調動它們的次序,也可動態地新增或者刪除責任

簡化了物件之間的連線,每個物件只需保持一個指向其後繼者的引用,不需保持其他所有處理者的引用,這避免了使用眾多的 if 或者 if···else 語句

每個類只需要處理自己該處理的工作,不該處理的傳遞給下一個物件完成,明確各類的責任範圍,符合類的單一職責原則

缺點:

不能保證每個請求一定被處理,由於一個請求沒有明確的接收者,所以不能保證它一定會被處理,該請求可能一直傳到鏈的末端都得不到處理

對比較長的職責鏈,請求的處理可能涉及多個處理物件,系統性能將受到一定影響

職責鏈建立的合理性要靠客戶端來保證,增加了客戶端的複雜性,可能會由於職責鏈的錯誤設定而導致系統出錯,如可能會造成迴圈呼叫

實現

角色:

抽象處理者(Handler)角色:定義一個處理請求的介面,包含抽象處理方法和一個後繼連線

具體處理者(Concrete Handler)角色:實現抽象處理者的處理方法,判斷能否處理本次請求,如果可以處理請求則處理,否則將該請求轉給它的後繼者

客戶類(Client)角色:建立處理鏈,並向鏈頭的具體處理者物件提交請求,它不關心處理細節和請求的傳遞過程

程式碼:

  1 /**抽象處理者**/
  2 public abstract class Leader {
  3     private Leader next;
  4     public void setNext(Leader next){
5 this.next = next; 6 } 7 public Leader getNext(){ 8 return next; 9 } 10 11 public abstract void handleRequest(int LeaveDays); 12 13 } 14 15 /**具體處理者1**/ 16 public class ClassAdviser extends Leader{ 17 18 @Override 19 public void handleRequest(int LeaveDays) { 20 // TODO Auto-generated method stub 21 if(LeaveDays <= 2){ 22 System.out.println("班主任批准了你"+LeaveDays+"天的請假"); 23 }else{ 24 if(getNext()!= null){ 25 System.out.println( "天數過多,班主任沒有審批許可權" ); 26 getNext().handleRequest(LeaveDays); 27 }else{ 28 System.out.println("沒有人處理這次請假"); 29 } 30 } 31 } 32 } 33 34 /**具體處理者2**/ 35 public class DepartmentHead extends Leader{ 36 37 @Override 38 public void handleRequest(int LeaveDays) { 39 // TODO Auto-generated method stub 40 if(LeaveDays <= 5){ 41 System.out.println("系主任批准了你"+LeaveDays+"天的請假"); 42 }else{ 43 if(getNext()!= null){ 44 System.out.println( "天數過多,系主任沒有審批許可權" ); 45 getNext().handleRequest(LeaveDays); 46 }else{ 47 System.out.println("沒有人處理這次請假"); 48 } 49 } 50 } 51 } 52 53 /**具體處理者3**/ 54 public class DeanOfStudies extends Leader{ 55 56 @Override 57 public void handleRequest(int LeaveDays) { 58 // TODO Auto-generated method stub 59 if(LeaveDays <= 10){ 60 System.out.println("教務處批准了你"+LeaveDays+"天的請假"); 61 }else{ 62 if(getNext()!= null){ 63 System.out.println( "天數過多,教務處沒有審批許可權" ); 64 getNext().handleRequest(LeaveDays); 65 }else{ 66 System.out.println("沒有人處理這次請假"); 67 } 68 } 69 } 70 } 71 72 /**具體處理者4**/ 73 public class Dean extends Leader{ 74 75 @Override 76 public void handleRequest(int LeaveDays) { 77 // TODO Auto-generated method stub 78 if(LeaveDays <= 20){ 79 System.out.println("院長批准了你"+LeaveDays+"天的請假"); 80 }else{ 81 if(getNext()!= null){ 82 System.out.println( "天數過多,院長批准你退學了" ); 83 }else{ 84 System.out.println("沒有人處理這次請假"); 85 } 86 } 87 } 88 } 89 90 /**客戶類**/ 91 public class Package { 92 93 public void packageTeacher(int days){ 94 Leader leader1 = new ClassAdviser(); 95 Leader leader3 = new DeanOfStudies(); 96 Leader leader4 = new Dean(); 97 Leader leader2 = new DepartmentHead(); 98 99 leader1.setNext(leader2); 100 leader2.setNext(leader3); 101 leader3.setNext(leader4); 102 leader4.setNext(leader4); 103 System.out.println( "我要請"+days+"天的假期" ); 104 leader1.handleRequest(days); 105 } 106 } 107 108 /**測試方法**/ 109 public class App { 110 public static void main( String[] args ){ 111 Package package1 = new Package(); 112 package1.packageTeacher(2); 113 System.out.println("-------------------------------"); 114 package1.packageTeacher(8); 115 System.out.println("-------------------------------"); 116 package1.packageTeacher(15); 117 System.out.println("-------------------------------"); 118 package1.packageTeacher(20); 119 System.out.println("-------------------------------"); 120 package1.packageTeacher(25); 121 System.out.println("-------------------------------"); 122 } 123 } 124 125 測試結果: 126 我要請2天的假期 127 班主任批准了你2天的請假 128 ------------------------------- 129 我要請5天的假期 130 天數過多,班主任沒有審批許可權 131 系主任批准了你5天的請假 132 ------------------------------- 133 我要請10天的假期 134 天數過多,班主任沒有審批許可權 135 天數過多,系主任沒有審批許可權 136 教務處批准了你10天的請假 137 ------------------------------- 138 我要請20天的假期 139 天數過多,班主任沒有審批許可權 140 天數過多,系主任沒有審批許可權 141 天數過多,教務處沒有審批許可權 142 院長批准了你20天的請假 143 ------------------------------- 144 我要請25天的假期 145 天數過多,班主任沒有審批許可權 146 天數過多,系主任沒有審批許可權 147 天數過多,教務處沒有審批許可權 148 天數過多,院長批准你退學了 149 -------------------------------