責任鏈模式和裝飾器模式

1.6 責任鏈模式

使用場景:例如在論壇上發表文章上傳到伺服器,我們要進行脫敏,檢查是否有黑客程式碼等,需要進行過濾。如果過濾都寫在一塊,一方面不方便擴展,一方面程式碼臃腫(有可能每一種過濾的程式碼特別多)

public static void main(String[] args) {
    Msg msg = new Msg();
    
    msg.setMsg("大家好,<script> , 歡迎來到我的網站,大家都是hapi");
    List<Filter> filters = new ArrayList<>();
    filters.add(new HTMLFilter());
    filters.add(new SensitiveFilter());
    
    // 責任鏈裡面的所有方法都需要處理過濾操作
    for(Filter f : filters) {
        f.doFilter(msg);
    }
}

interface Filter{
    void doFilter(String msg);
}

class HTMLFilter inplaments Filter{
    void doFilter(String msg) {
        // TODO
    }
}

class SensitiveFilter inplaments Filter{
    void doFilter(String msg) {
        // TODO
    }
}

最終達到這種效果:msg -> filter1 -> filter2 -> DB
最終的責任鏈:

class FilterChain{
    List<Filter> filters = new ArrayList<>();
    
    // 增加鏈條
    public void add(Filter filter){
        filters.add(f);
    }
    
    // 進行鏈式過濾
    public void doFilter(Msg m){
        for(Filter f : filters) {
            f.doFilter(m);
        }
    }
}
  • 定義自己不同的Filter,鏈接成鏈過濾

1.7 裝飾器模式-Decorator

1.7.1 傳統方式替代方案

  • 如果不了解裝飾器模式,那麼要在原有東西上面加裝飾,直觀上就是繼承,比如美國人繼承人,黑色美國人繼承美國人等,大量的繼承人會產生類爆炸
  • 裝飾器模式常被用在圖形介面的解決方案中,例如把某個東西加點樣式等

1.7.2 裝飾器模式解決方案

裝飾器模式,就是例如在原有的東西上面加裝飾:

  1. PersonDecorator類中添加Person屬性
Public class PerionDecorator {
    Persion p;
    public Person getPerson {
        p = new Person();
        // 增加裝飾
        p.setColor();
        return p;
    }
}