Golang 过滤器设计模式(六)
上一篇:适配器设计模式https://blog.csdn.net/weixin_40165163/article/details/90716357github:https://github.com/zhumengyifang/GolangDesignPatterns过滤器设计模式wiki百科:过滤器设计模式或标准模式是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通...
文章共702字 · 阅读需要大约3分钟
一键AI生成摘要,助你高效阅读
问答
·
上一篇:适配器设计模式https://blog.csdn.net/weixin_40165163/article/details/90716357
github:https://github.com/zhumengyifang/GolangDesignPatterns
过滤器设计模式
wiki百科: 过滤器设计模式或标准模式是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解偶的方式把它们连接起来。这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。
实现
我们将创建一个Person对象、Criteria接口和实现了该接口的实体类,来过滤Person对象的列表。CriteriaPatternDemo,我们的演示类使用Criteria对象,基于各种标准和他们的结合来过滤Person对象的列表。
代码:
package FilterPattern
type Person struct {
Name string
Gender string
MaritalStatus string
}
func GetPerson(name string, gender string, maritalStatus string) Person {
return Person{Name: name, Gender: gender, MaritalStatus: maritalStatus}
}
package FilterPattern
//为标准(Criteria)创建一个接口。
type Criteria interface {
MeetCriteria(persons []Person) []Person
}
type CriteriaMale struct {
}
//按照性别男过滤
func (s *CriteriaMale) MeetCriteria(persons []Person) []Person {
var femalePersons []Person
for _, person := range persons {
if person.Gender == "Male" {
femalePersons = append(femalePersons, person)
}
}
return femalePersons
}
type CriteriaFemale struct {
}
//按照性别女过滤
func (s *CriteriaFemale) MeetCriteria(persons []Person) []Person {
var femalePersons []Person
for _, person := range persons {
if person.Gender == "Female" {
femalePersons = append(femalePersons, person)
}
}
return femalePersons
}
type CriteriaSingle struct {
}
//按照未婚过滤
func (s *CriteriaSingle) MeetCriteria(persons []Person) []Person {
var femalePersons []Person
for _, person := range persons {
if person.MaritalStatus == "Single" {
femalePersons = append(femalePersons, person)
}
}
return femalePersons
}
type AndCriteria struct {
criteria Criteria
otherCriteria Criteria
}
//使用需要的过滤组合
func (s *AndCriteria) AndCriteria(criteria Criteria, otherCriteria Criteria) {
s.criteria = criteria
s.otherCriteria = otherCriteria
}
//多重组合过滤
func (s *AndCriteria) MeetCriteria(persons []Person) []Person {
firstCriteriaPersons := s.criteria.MeetCriteria(persons)
return s.otherCriteria.MeetCriteria(firstCriteriaPersons)
}
type OrCriteria struct {
criteria Criteria
otherCriteria Criteria
}
测试:
func testFilterPattern() {
var persons []FilterPattern.Person
persons = append(persons, FilterPattern.GetPerson("Robert", "Male", "Single"))
persons = append(persons, FilterPattern.GetPerson("John", "Male", "Married"))
persons = append(persons, FilterPattern.GetPerson("Laura", "Female", "Married"))
persons = append(persons, FilterPattern.GetPerson("Diana", "Female", "Single"))
persons = append(persons, FilterPattern.GetPerson("Mike", "Male", "Single"))
persons = append(persons, FilterPattern.GetPerson("Bobby", "Male", "Single"))
male := new(FilterPattern.CriteriaMale)
fmt.Println(male.MeetCriteria(persons))
female := new(FilterPattern.CriteriaFemale)
fmt.Println(female.MeetCriteria(persons))
single := new(FilterPattern.CriteriaSingle)
fmt.Println(single.MeetCriteria(persons))
singleMale := new(FilterPattern.AndCriteria)
singleMale.AndCriteria(single, male)
fmt.Println(singleMale.MeetCriteria(persons))
singleFemale := new(FilterPattern.AndCriteria)
singleFemale.AndCriteria(single, female)
fmt.Println(singleFemale.MeetCriteria(persons))
}
输出:
[{Robert Male Single} {John Male Married} {Mike Male Single} {Bobby Male Single}]
[{Laura Female Married} {Diana Female Single}]
[{Robert Male Single} {Diana Female Single} {Mike Male Single} {Bobby Male Single}]
[{Robert Male Single} {Mike Male Single} {Bobby Male Single}]
[{Diana Female Single}]
也是一种相对简单灵活的设计模式。
下一篇桥接设计模式:https://blog.csdn.net/weixin_40165163/article/details/90731470
更多推荐
已为社区贡献11条内容
所有评论(0)