過濾器模式(C 實現)之幫你選個男朋友

2021-09-03 03:07:40 字數 4423 閱讀 2396

過濾器模式(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可以最大限度避免上述缺點,使其可以在更小空間上,進行高效插入和查詢。經常使用快取...