過濾器模式(filter pattern)或標準模式(criteria pattern)是一種設計模式,這種模式允許開發人員使用不同的標準來過濾一組物件,通過邏輯運算以解耦的方式把它們連線起來。這種型別的設計模式屬於結構型模式,它結合多個標準來獲得單一標準。這種這麼官方的介紹當然是我從菜鳥教程複製過來的——過濾器模式|菜鳥教程
creiteria是所有過濾器的基類,與組合過濾器的關係應該算是聚合吧
至於boy,當然就是你的物件啊,狗頭.jpg
boy.h
#ifndef _boy_
#define _boy_
#include
#include
#include
"stdio.h"
using
namespace std;
class
boybool
operator
<
(const boy& b)
bool
operator==(
const boy& b)()
double
get_weight()
double
get_height()
string get_name()
const
string show_me()
;snprintf
(describation,
sizeof
(describation)-1
,, m_name.
c_str()
, m_height,
c_str()
);return describation;}}
;#endif
criteria.h
#ifndef _criteria_
#define _criteria_
#include
"boy.h"
#include
#include
#include
#include
#include
using
namespace std;
const
double g_d_value =
1e-6
;class
criteria
;class
criteria_handsome
:public criteria
}return
this
->m_list;}}
;class
criteria_higher
:public criteria
virtual list
filter
(list filter_list)
}return
this
->m_list;}}
;class
or_criteria
//||過濾器會累積重複的物件,去重
m_list.
sort()
;//unique指向不重複序列的下乙個物件
m_list.
erase
(unique
(m_list.
begin()
, m_list.
end())
, m_list.
end())
;return m_list;
}void
add_criteria
(shared_ptr filter)};
class
and_criteria
return m_list;
}void
add_criteria
(shared_ptr filter)};
#endif
filter_pattern.cpp
#include
#include
#include
"criteria.h"
#include
"boy.h"
using
namespace std;
intmain
(int argc,
const
char
*argv)
//&&過濾器
shared_ptr
face_filter
(new criteria_handsome)
; and_criteria and_filter;
and_filter.
add_criteria
(height_filter)
; and_filter.
add_criteria
(face_filter)
; list and_filter_boy = and_filter.
filter
(list_boy)
; cout <<
"the list boy after and filter:"
<< endl;
for(it = and_filter_boy.
begin()
; it != and_filter_boy.
end(
); it++
)//||過濾器
or_criteria or_filter;
or_filter.
add_criteria
(height_filter)
; or_filter.
add_criteria
(face_filter)
; list or_filter_boy = or_filter.
filter
(list_boy)
; cout <<
"the list boy after or filter:"
<< endl;
for(it = or_filter_boy.
begin()
; it != or_filter_boy.
end(
); it++
)return0;
}
在寫demo的時候試了下c++智慧型指標和list容器中的元素是智慧型指標share_ptr,推薦使用7.3版本的gcc,體驗最新版的c++
[root@bogon filter_pattern]
# g++ filter_pattern.cpp
[root@bogon filter_pattern]
# ./a.out
the list boy after height filter:
name:wyf
187.50cm
85.00kg
name:answer
183.00cm
75.00kg
name:***
180.00cm
100.00kg
the list boy after and filter:
name:wyf
187.50cm
85.00kg
name:answer
183.00cm
75.00kg
the list boy after or filter:
name:answer
183.00cm
75.00kg
name:lh
175.50cm
65.30kg
name:wyf
187.50cm
85.00kg
name:***
180.00cm
100.00kg
過濾了下,最醜的當然是你的物件啊,狗頭.jpg
組合過濾器,||過濾器,多次過濾一組物件,會得到重複的物件誒,怎麼搞?
那就把鍊錶中的物件去重下吧,使用unique函式iterator unique(iterator it_1,iterator it_2,bool myfunc);
,注意該函式的標頭檔案#include
,unique的實現是將鍊錶中所有相鄰並且相同的元素往後移,所以使用unique前先list.sort,然後再配合list.erase使用就好。
list容器的元素是自定義物件,編譯過程中容易遇到下面的問題:
這是編譯器不知道怎麼比較你寫的自定義物件了,所以你的自定義類中需要對一些==等符號去過載實現。
設計模式 過濾器模式(C 實現)
允許開發人員使用不同的標準來過濾一組物件,通過邏輯運算以解耦的方式把它們連線起來。屬於結構型模式,它結合多個標準來獲得單一標準。需要在乙個集合中按照一定的條件和規則篩選出子集合,可以用過濾器模式。採用菜鳥教程的例子,這裡用c 實現 include include include includeusi...
架構設計模式之管道 過濾器模式
管道 過濾器模式的體系結構是面向資料流的軟體體系結構。它最典型的應用是在編譯系統。乙個普通的編譯系統包括詞法分析器,語法分析器,語義分析與中間 生成器,優化器,目標 生成器等一系列對源程式進行處理的過程。人們可以將編譯系統看作一系列過濾器的連線體,按照管道 過濾器的體系結構進行設計。此外,這種體系結...
探索C 之布隆過濾器 Bloom filter
背景介紹 演算法原理 誤判率bf改進 總結bloom filter 後面簡稱bf 是bloom在1970年提出的二進位制向量資料結構。通俗來說就是在大資料集合下高效判斷某個成員是否屬於這個集合。bf其優點在於 而使用bf可以最大限度避免上述缺點,使其可以在更小空間上,進行高效插入和查詢。經常使用快取...