发红包案例:
案例目录结构如下(red包为第三方包,需要的话可以到网上自行下载或私信我邮箱即可):
// 1.这里将借用发红包的框架:RedPacketFrame(图形界面化),OpenMode处理红包分发逻辑的接口(里面只有一个抽象方法,需要自己实现),实现普通红包和手气红包的分发:
// 框架中提供相关参数:totalMoney(红包总金额)、totalCount(要分发的总份数)、divide(int totalMoney, int totalCount)处理方法、ArrayList<Integer>(将处理后的数据放到数组列表中)
/* 2.注意事项:
普通红包(平均分发):totalMoney / totalCount,平均分发会有除不尽的情况,此时推荐将余数加到最后一份上。
手气红包(随机):手气红包处理逻辑可以自己设计,这里推荐一种常用的设计思想:最少一分钱(java底层已经将钱转换为分计算了),最多不超过平均数的2倍,余额越发越少。
RedPacketFrame为一个抽象类,不能直接new对象,需要通过实现类来使用此抽象类。
setOwnerName("字符串"):此方法是RedPacketFrame框架提供我们修改发红包人名字的。
setOpenWay(OpenWay):设置分发(打开)红包的方式,里面传入OpenWay类型的数据。
*/
import red.OpenMode;
// 3.导入RedPacketFrame抽象类:
import red.RedPacketFrame;//特别提醒:导入一个自定义的包时,需要在包中的java文件中声明包,其格式:package 包中java文件所在的位置,如:package red;
public class Start{public static void main(String[] args){// 5.创建一个红包:SonRedPackClass redpack = new SonRedPackClass("测试发红包案例");//这里传入字符串用来设置红包的标题redpack.setOwnerName("苦海");//设置发红包人姓名// 7.创建平均分发红包对象:OpenMode avgredpack = new AvgRedPack();// OpenMode randomredpack = new RandomRedPack();//经测试,随机分发红包处理方法可以实现redpack.setOpenWay(avgredpack);//设置打开方式为平均分发红包,当着这里可以传入随机分发红包的OpenMode数据};
};
import red.RedPacketFrame;//导入RedPacketFrame用来被继承
// 4.创建一个SonRedPackcCass子类(实现类)来继承RedPacketFrame:
public class SonRedPackClass extends RedPacketFrame{public SonRedPackClass(String title){//title为图形界面的标题super(title);//通过super调用父级的构造方法}
};
// 6.实现OpenMode接口中的divide方法,这里使用平均分发的思想覆盖重写 divide方法:
import java.util.ArrayList;
import red.OpenMode;
public class AvgRedPack implements OpenMode{@Overridepublic ArrayList<Integer> divide(final int totalMoney,final int totalCount){//因为在整个分发过程中总份数和总钱数不变,这里可以使用final进行修饰,当然不写也可以ArrayList<Integer> list = new ArrayList<>();//创建一个数组,用来存放平均分发的每一份数据int avg = totalMoney / totalCount;//平均数int mod = totalMoney % totalCount;//余数// 将平均数通过循环放入到数组中,余数推荐分发给最后一个或第一个,这里将余数分发给最后一个了,如:for(int i = 0; i < totalCount;i++){if(i == totalCount-1){list.add(avg + mod);}else{list.add(avg);}};return list;};
}
// 8.再实现一下OpenMode接口中随机分发红包的方法divide:
import java.util.ArrayList;
import red.OpenMode;
import java.util.Random;
public class RandomRedPack implements OpenMode{@Overridepublic ArrayList<Integer> divide(final int totalMoney,final int totalCount){//因为在整个分发过程中总份数和总钱数不变,这里可以使用final进行修饰,当然不写也可以ArrayList<Integer> list = new ArrayList<>();//创建一个数组,用来存放随机分发的每一份数据//定义两个变量:剩余金额、剩余分发次数,如:int leftMoney = totalMoney;//初始化为总金额,每分发一次,金额减少一次int leftCount = totalCount;//初始化为总次数,每分发一次,次数减少一次// 通过循环产生随机数,并将产生的随机数放到数字中:for(int i = 0; i < totalCount;i++){//前面的人得到随机红包,最后一个人将剩余金额都给他即可,因此这里循环总人数-1Random random = new Random();//创建一个随机数生成器int money = random.nextInt(leftMoney / leftCount *2) + 1;//生成随机金额,最少应分到1分钱,所以因是1+一个随机数;if(i == totalCount-1){list.add(leftMoney);}else{list.add(money);};leftMoney -= money;leftCount--;};return list;};
}
提示:本文图片等素材来源于网络,若有侵权,请发邮件至邮箱:810665436@qq.com联系笔者删除。
笔者:苦海