一個簡單的例子講講Android開發中的標準模式(過濾器模式)
技術標籤:Android開發設計模式androidkotlin
標準模式(過濾器模式)可以根據設定的標準過濾物件。
現在我們來舉個例子:一個生鮮App,我們可以根據商品的產地、以及是否為蔬菜進行過濾。
①建立過濾介面。
/**
* 過濾介面
*/
interface Filter {
//過濾準則
fun meetCriteria(ingredients:List<Ingredient>):MutableList<Ingredient>
}
②建立商品原料類。
/**
* 原料類
* @param name:原料名稱
* @param local:產地
* @param vegetarian:是否為蔬菜
*/
data class Ingredient(val name:String, val local:String, val vegetarian:Boolean){
}
③建立過濾器,這裡我們分別建立“滿足蔬菜標準的過濾器”、“滿足本地產品的過濾器”、“滿足非本地產品的過濾器”、“滿足AND標準的過濾器”以及“滿足OR標準的過濾器”,如下所示:
//滿足蔬菜標準的過濾器
class VegetarianFilter:Filter {
override fun meetCriteria(ingredients: List<Ingredient>): MutableList< Ingredient> {
val vegetarianList = ArrayList<Ingredient>()
for (ingredient in ingredients){
if (ingredient.vegetarian){
vegetarianList.add(ingredient)
}
}
return vegetarianList
}
}
//本地產品過濾器
class LocalFilter :Filter{
override fun meetCriteria(ingredients: List<Ingredient>): MutableList<Ingredient> {
val localList = ArrayList<Ingredient>()
for (ingredient in ingredients){
if (Objects.equals(ingredient.local,"遼寧")){
localList.add(ingredient)
}
}
return localList
}
}
//非本地產品過濾器
class NotLocalFilter :Filter{
override fun meetCriteria(ingredients: List<Ingredient>): MutableList<Ingredient> {
val nonLocalList = ArrayList<Ingredient>()
for (ingredient in ingredients){
if (ingredient.local!="遼寧"){
nonLocalList.add(ingredient)
}
}
return nonLocalList
}
}
//AND標準過濾器
class AndCriteria(private val criteria:Filter, private val otherCriteria:Filter) :Filter{
override fun meetCriteria(ingredients: List<Ingredient>): MutableList<Ingredient> {
val firstCriteriaList = criteria.meetCriteria(ingredients)
return otherCriteria.meetCriteria(firstCriteriaList)
}
}
//OR標準過濾器
class OrCriteria(private val criteria:Filter, private val otherCriteria:Filter) :Filter{
override fun meetCriteria(ingredients: List<Ingredient>): MutableList<Ingredient> {
val firstCriteriaList = criteria.meetCriteria(ingredients)
val nextCriteriaList = otherCriteria.meetCriteria(ingredients)
for (ingredient in nextCriteriaList){
if (!firstCriteriaList.contains(ingredient)){
firstCriteriaList.add(ingredient)
}
}
return firstCriteriaList
}
}
④建立測試資料集、過濾器來進行測試。
//測試標準模式
//1.新增一個數據集
val ingredients = ArrayList<Ingredient>()
ingredients.add(Ingredient("黃瓜","遼寧",true))
ingredients.add(Ingredient("雞肉","黑龍江",false))
ingredients.add(Ingredient("西紅柿","山東",true))
ingredients.add(Ingredient("河蟹","遼寧",false))
//2.建立過濾器
val local = LocalFilter()
val notLocal = NotLocalFilter()
val vegetarian = VegetarianFilter()
val localAndVegetarian = AndCriteria(local,vegetarian)
val localOrVegetarian = OrCriteria(local,vegetarian)
//3.測試模式
Log.d(TAG,"本地:${local.meetCriteria(ingredients).toString()}")
Log.d(TAG,"非本地:${notLocal.meetCriteria(ingredients).toString()}")
Log.d(TAG,"蔬菜:${vegetarian.meetCriteria(ingredients).toString()}")
Log.d(TAG,"本地蔬菜:${localAndVegetarian.meetCriteria(ingredients).toString()}")
Log.d(TAG,"本地或者蔬菜:${localOrVegetarian.meetCriteria(ingredients).toString()}")
測試結果如下所示:
*本地:[Ingredient(name=黃瓜, local=遼寧, vegetarian=true), Ingredient(name=河蟹, local=遼寧, vegetarian=false)]
非本地:[Ingredient(name=雞肉, local=黑龍江, vegetarian=false), Ingredient(name=西紅柿, local=山東, vegetarian=true)]
蔬菜:[Ingredient(name=黃瓜, local=遼寧, vegetarian=true), Ingredient(name=西紅柿, local=山東, vegetarian=true)]
本地蔬菜:[Ingredient(name=黃瓜, local=遼寧, vegetarian=true)]
本地或者蔬菜:[Ingredient(name=黃瓜, local=遼寧, vegetarian=true), Ingredient(name=河蟹, local=遼寧, vegetarian=false), Ingredient(name=西紅柿, local=山東, vegetarian=true)]*
可以看到,僅僅是應用了一些簡單的標準就可以很容易地使用合適的過濾器過濾相關符合選擇條件的資訊。