1. 程式人生 > >設計模式之過濾器模式

設計模式之過濾器模式

博主上次分析完cas客戶端原始碼後,發現了其實就是一個過濾器模式,對請求以及session一直做校驗,每個過濾器都有各自的工作,互不影響耦合性低,所以就模仿其原始碼,做了一次過濾器模式的學習,圖示如下

 

 其實過濾器整個類可以不用,只不過在jetty中,過濾器整合類不知有過濾器還有其他屬性,比如config配置等。如下:參考即可

 

 好了,我們來看一下過濾器模式,一個過濾器介面定義方法,多個實現類去實現具體操作過濾,一個整合類增加一個過濾器,一個過濾器連結串列去實現以節點型別,依次進行過濾

該介面進行定義方法:

 1 import java.io.IOException;
 2 import java.util.List;
 3 
 4 /**
 5  * @title: DemoFilter
 6  * @Author junyu
 7  * 舊巷裡有一個穿著白襯衫笑起來如太陽般溫暖我的少年。
 8  * 記憶裡有一個穿著連衣裙哭起來如孩子般討人喜的女孩。
 9  * 他說,哪年樹彎了腰,人見了老,桃花落了白髮梢,他講的笑話她還會笑,那便是好。
10  * 她說,哪年國改了號,墳長了草,地府過了奈何橋,她回頭看時他還在瞧,就不算糟。
11  * @Date: 2020/7/18 9:23
12  * @Version 1.0
13  */
14 public interface DemoFilter{
15 
16     void doFilter(List list, DemoFilterChain demoFilterChain);
17 }
DemoFilter

多個實現類:

 1 import java.util.List;
 2 
 3 /**
 4  * @title: AFilterImpl
 5  * @Author junyu
 6  * 舊巷裡有一個穿著白襯衫笑起來如太陽般溫暖我的少年。
 7  * 記憶裡有一個穿著連衣裙哭起來如孩子般討人喜的女孩。
 8  * 他說,哪年樹彎了腰,人見了老,桃花落了白髮梢,他講的笑話她還會笑,那便是好。
 9  * 她說,哪年國改了號,墳長了草,地府過了奈何橋,她回頭看時他還在瞧,就不算糟。
10  * @Date: 2020/7/18 11:58
11  * @Version 1.0
12  */
13 public class AFilterImpl implements DemoFilter{
14 
15     @Override
16     public void doFilter(List list, DemoFilterChain demoFilterChain) {
17         System.out.println("AFilterImpl is beginning");
18         if (list.isEmpty()) {
19             System.out.println("該列表為空,無需過濾!");
20             return;
21         }
22         demoFilterChain.doFilter(list);
23     }
24 }
AFilterImpl
 1 import java.util.List;
 2 
 3 /**
 4  * @title: BFilterImpl
 5  * @Author junyu
 6  * 舊巷裡有一個穿著白襯衫笑起來如太陽般溫暖我的少年。
 7  * 記憶裡有一個穿著連衣裙哭起來如孩子般討人喜的女孩。
 8  * 他說,哪年樹彎了腰,人見了老,桃花落了白髮梢,他講的笑話她還會笑,那便是好。
 9  * 她說,哪年國改了號,墳長了草,地府過了奈何橋,她回頭看時他還在瞧,就不算糟。
10  * @Date: 2020/7/18 13:34
11  * @Version 1.0
12  */
13 public class BFilterImpl implements DemoFilter{
14 
15     @Override
16     public void doFilter(List list, DemoFilterChain demoFilterChain) {
17         System.out.println("BFilterImpl is beginning");
18         System.out.println("list`s body:");
19         list.stream().forEach(one ->{
20             System.out.print( one + ",");
21         });
22         demoFilterChain.doFilter(list);
23     }
24 }
BFilterImpl

一個整合類

 1 **
 2  * @title: FilterHolder
 3  * @Author junyu
 4  * 舊巷裡有一個穿著白襯衫笑起來如太陽般溫暖我的少年。
 5  * 記憶裡有一個穿著連衣裙哭起來如孩子般討人喜的女孩。
 6  * 他說,哪年樹彎了腰,人見了老,桃花落了白髮梢,他講的笑話她還會笑,那便是好。
 7  * 她說,哪年國改了號,墳長了草,地府過了奈何橋,她回頭看時他還在瞧,就不算糟。
 8  * @Date: 2020/7/18 9:21
 9  * @Version 1.0
10  */
11 public class FilterHolder{
12     private transient DemoFilter filter;
13 
14     public DemoFilter getFilter() {
15         return filter;
16     }
17 
18     public void setFilter(DemoFilter filter) {
19         this.filter = filter;
20     }
21 }
FilterHolder

一個過濾器連結串列

 1 import java.util.List;
 2 
 3 /**
 4  * @title: DemoFilterChain
 5  * @Author junyu
 6  * 舊巷裡有一個穿著白襯衫笑起來如太陽般溫暖我的少年。
 7  * 記憶裡有一個穿著連衣裙哭起來如孩子般討人喜的女孩。
 8  * 他說,哪年樹彎了腰,人見了老,桃花落了白髮梢,他講的笑話她還會笑,那便是好。
 9  * 她說,哪年國改了號,墳長了草,地府過了奈何橋,她回頭看時他還在瞧,就不算糟。
10  * @Date: 2020/7/18 9:35
11  * @Version 1.0
12  */
13 public class DemoFilterChain{
14     FilterHolder filterHolder;
15     DemoFilterChain next;
16 
17     DemoFilterChain(List<DemoFilter> list){
18         if (list.isEmpty()) {
19             return;
20         }
21         filterHolder = new FilterHolder();
22         filterHolder.setFilter(list.get(0));
23         list.remove(0);
24         next = new DemoFilterChain(list);
25     }
26 
27     public void doFilter(List list) {
28         if (filterHolder != null) {
29             DemoFilter filter = filterHolder.getFilter();
30             filter.doFilter(list,next);
31         }
32     }
33 }
DemoFilterChain

進行測試

 1 import java.util.ArrayList;
 2 import java.util.List;
 3 
 4 /**
 5  * @title: TestMain
 6  * @Author junyu
 7  * 舊巷裡有一個穿著白襯衫笑起來如太陽般溫暖我的少年。
 8  * 記憶裡有一個穿著連衣裙哭起來如孩子般討人喜的女孩。
 9  * 他說,哪年樹彎了腰,人見了老,桃花落了白髮梢,他講的笑話她還會笑,那便是好。
10  * 她說,哪年國改了號,墳長了草,地府過了奈何橋,她回頭看時他還在瞧,就不算糟。
11  * @Date: 2020/7/18 13:40
12  * @Version 1.0
13  */
14 public class TestMain {
15 
16     public static void main(String[] args) {
17         List<DemoFilter> list = new ArrayList<>();
18         AFilterImpl aFilter = new AFilterImpl();
19         BFilterImpl bFilter = new BFilterImpl();
20         list.add(aFilter);
21         list.add(bFilter);
22         DemoFilterChain demoFilterChain = new DemoFilterChain(list);
23 
24         List<String> filterList = new ArrayList<>();
25         filterList.add("this is filter string");
26         filterList.add("this is filter end");
27 
28         demoFilterChain.doFilter(filterList);
29 
30     }
31 }

輸出結果:

AFilterImpl is beginning
BFilterImpl is beginning
list`s body:
this is filter string,this is filter end,


編寫不易,如若轉載請寫明出處:https://www.cnblogs.com/guoxiaoyu/p/13335797.html

 

&n