java行为参数化,不要啰嗦代码
1.行为参数化
如何选择好商店呢?
我们可以通过客户量每天或者销售总额来考虑吗?
如果有需求是这样的,客流量到1000个人/每天,销售额总金额到20000元来过滤是否是好商店铺
我们通过枚举进行过滤
1.1
enum goodShop{CUSTOMS_NUMBER,SUMMARY} 进行考虑
public static List<Goodshop> filterCustomsShop(List<Goodshop> inventory){
List<Goodsshop> result = new ArrayList<>();
for( Goodshop shop : inventroy){
if (CUSTOMS_NUMBER<= shop.getCUSTOMS_NUMBER()){
result.add(shop);
}
return result;
}
通过客户数量来过滤,代码写死了,如果又有一个需求,需要增加客户数中的男女或者比例,这种方法,只有再增加一个filterCostomsManShop。很明显代码写死不好变通,需要将类似这种代码继续进行抽象。
1.2 将这些过滤参数进行参数,传送进来会如何
public static List<Goodshop> filterCustomsOrSUMMARYShop(List<Goodshop> inventory,NUMBER){
List<Goodsshop> result = new ArrayList<>();
for( Goodshop shop : inventroy){
if (NUMBER<= shop.NUMBER()){
result.add(shop);
}
return result;
}
参数并不知道要传送的是客户数量还是销售总额。用NUMBER进行处理,这里没有考虑精度问题。暂时都是整形好啦。
如果要在list进行过滤客户数量和销售金额都满足的list值,需要怎么调用呢?
List<Goodshop> shopcustoms= filterCustomsOrSummaryShop(inventory,CUSTOMS_NUMBER);
List<Goodshop> shopSummary= filterCustomsOrSummaryShop(inventory,SUMMARY);
这种好像是满足了上面的条件。不知道发现没有,过滤代码中有大量的遍历list的循环。如何改变筛选遍历方式进行提升性能呢?
引用了行为参数化
2.1 定义接口来选择标准建模
定义一个选择商店的策略
public interface ShopPredicate{
boolean test(Shop shop);
}
定义根据客户数来选商品的策略
选出客户数大于等于1000的商品
public class ShopCustomsNumberPredicate implements ShopPredicate{
public boolean test(Shop shop){
return shop.getCustoms() >= 1000;
}
}
public class ShopSummaryPredicate implements ShopPredicate{
public boolean test(Shop shop){
return shop.getSummary() > 20000;
}
}
通过2个分别不同策略来过滤,这种行为参数化,策略设计模型相关,它让你定义一族算法,把它封装起来为策略
然后运行一个算法,算法族为就是ShopPredicate,不同的策略就是ShopCustomsNumberPredicate和ShopSummaryPredicate
还要利用ShopPredicate的不同实现,需要filterShops方法来接受ShopPredicate对象,对Shop进行条件测试。这种叫为行为参数化:让方法接受多种行为(策略)作为参数,并在内部使用,来完成不同的行为。
2.1 根据抽象条件筛选
利用ShopPredicate改过之后的filter方法
public static List<Shop> filterShops(List<Shop> inventory,ShopPredicate p){
List<Shop> result= new ArrayList<>();
for(Shop shop: inventory){
if (p.test(shop)){ //接口定义中有这个test,实际就是测试店铺是否满足条件
result.add(shop);
}
}
}
2.1.1 传递代码或行为
上述代码,代码清晰,读起来,用起来也好理解,要实现不同的ShopPredicate对象,并将它们传递个filterShop方法中
比如:如果用户想找到客户数在1000个并且是销售额大于20000的shop。创建一个类来实现ShopPredicate就可以。
public class ShopCustersAndSummary2WPredicate implemnts ShopPredicate{
public boolean test(Shop shop){
return shop.getCusters>1000 && shop.getSummary()>=20000;
}
}
List<Shop> result= filterShops(inventroy,new ShopCustersAndSummary2WPredicate());
上述唯一的代码test实现。正是它定义了filterShops的方法的新行为。test的是返回布尔类型的。参数化filterShops的行为传递不同的筛选策略。
2.1.2 多种行为,一个参数
编写一个灵活的prettyPrintShop方法
public static prettyPrintShop(List<Shop> inventory,???){
for(Shop shop : inventroy){
String output=???.???(shop);
System.out.println(output);
}
}
上述代码中的???希望返回一个String值的方法。那么久需要在ShopPredicate实现toString的方法
定义接口 accept 返回String
public interface ShopFormatter{
String accept(Shop s);
}
编写多种格式的格式行为
public class ShopFancyFormatter implement ShopFormatter{
public String accept(Shop s){
String Char = s.getCusters()>1000 ? "好","差";
return "A "+Char +" " + s.getSummary()+ " Shop";
}
}
public class ShopSimpleFormatter implement ShopFormatter{
public String accept(Shop s){
return "An Shop of " " + s.getSummary()+ " 销售额";
}
}
本文地址:https://blog.csdn.net/keny88888/article/details/107642486
上一篇: 蓝牙