上一篇:适配器设计模式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

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐