責任鏈模式和裝飾器模式
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 裝飾器模式解決方案
裝飾器模式,就是例如在原有的東西上面加裝飾:
- PersonDecorator類中添加Person屬性
Public class PerionDecorator {
Persion p;
public Person getPerson {
p = new Person();
// 增加裝飾
p.setColor();
return p;
}
}