欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java行为参数化,不要啰嗦代码

程序员文章站 2022-07-10 19:02:19
1.行为参数化如何选择好商店呢?我们可以通过客户量每天或者销售总额来考虑吗?如果有需求是这样的,客流量到1000个人/每天,销售额总金额到20000元来过滤是否是好商店铺我们通过枚举进行过滤1.1enum goodShop{CUSTOMS_NUMBER,SUMMARY} 进行考虑public static List filterCustomsShop(List inventory){ List<....

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

相关标签: spring实践大全