简单分析
普通红包参考Java发红包实现,
随机红包,随机分配,有可能多,有可能少。
比如你会得到最小的红包1分钱有可能,举个简单数字例子
1.第一次发红包,随机范围是0.01元~6.66元
2.第一次发完之后,剩下的至少是3.34元。
3.此时还需要再发2个红包
4.此时的再发范围应该是0.01元~3.34元(取不到右边,剩下0.01)
我是从网络上找到了图形界面,我们只需要看看他的方法和已知的类,然后进行调用就可以了
RedPacketFrame 图形化抽象类 红包案例的页面
public abstract class RedPacketFrame extends JFrame {
/* ownerName : 群主名称 */
public String ownerName = "谁谁谁谁";
/* openMode : 红包的类型 [普通红包/手气红包] */
public OpenMode openMode = null;
/**
* 构造方法:生成红包界面.
* @param title 页面的标题.
*/
public RedPacketFrame(String title) {
super(title);
init();// 页面相关的初始化操作
}
/* set方法 */
public void setOwnerName(String ownerName) {
this.ownerName = ownerName;
}
public void setOpenMode(OpenMode openMode) {
this.openMode = openMode;
}
}
OpenMode 接口 指定红包类型
public interface OpenMode {
/**
* @param totalMoney
总金额,单位是"分"。总金额为方便计算,已经转换为整数,单位为分。
* @param count
红包个数
* @return ArrayList<Integer>
元素为各个红包的金额值,所有元素的值累和等于总金额.
*
* 请将totalMoney,分成count分,保存到ArrayList<Integer>中,返回即可.
*/
public abstract ArrayList<Integer> divide(int totalMoney, int count);
}
实现步骤
先把红包页面通过创建新对象,然后调用红包页面案例方法,
因为不能直接通过创建新的类,直接调用RedPacketFrame
我们必须定义一个子类来继承RedPacketFrame ,然后在创建新的类调用子类
1.定义 RedPacket 类,继承 RedPacketFrame
import com.peihua.red.*;
public class RedPacket extends RedPacketFrame {
/**
* 构造方法:生成红包界面。
*
* @param title 界面的标题
*/
public RedPacket(String title) {
super(title); //创建新的红包页面类继承红包页面类,同时进行方法重写
}
}
2.定义测试类,创建 RedPacket 对象
public class RedPacketTest {
public static void main(String[] args) {
//创建红包对象
RedPacket redPacket=new RedPacket("大红包");
}
}
运行 页面如下
现在我们点击发红包会提示我们需要某些方法例如是谁发的红包谁谁谁谁setOwnerName
还有请通过setOpenWay方法
接下来创建这些方法
setOwnerName
redPacket.setOwnerName("小埋");
OpenMode
RedPacket 对象,设置红包类型。
setOpenMode(OpenMode openMode) ,是接口作为参数。我们必须定义接口的实现类,重写接口中方法,并传
递实现类对象到 setOpenMode 方法中,
创建OpenMode接口的实现类
普通红包:
import com.peihua.red.OpenMode;
import java.util.ArrayList;
public class Common implements OpenMode {
/**
* 请将totalMoney分成count份,保存到ArrayList<Integer>中,返回即可。
*
* @param totalMoney 总金额为方便计算,已经转换为整数,单位为分。
* @param totalCount 红包个数
* @return ArrayList<Integer> 元素为各个红包的金额值,所有元素的值累和等于总金额。
* 子类调用接口方法,方法要重写
*/
@Override
public ArrayList<Integer> divide(int totalMoney, int totalCount) {
//创建集合用来存储每份红包的金额
ArrayList<Integer> arrayList=new ArrayList<>();
//定义两个变量,一个用来计算每份红包的平均下来的金额多少,另一个是用在除不尽情况下用来存储余数(零头)
int money= totalMoney/totalCount;
int yumoney=totalMoney%totalCount;
//循环遍历,少一位,将每份的金额给添加到集合里
for (int i = 0; i < totalCount-1; i++) {
arrayList.add(money);
}
//将最后的余数(零头)给随即添加到数组中的元素
int last=money+yumoney;
arrayList.add(last);
//返回值
return arrayList;
}
}
手气(随机)红包:
import com.peihua.red.OpenMode;
import java.util.ArrayList;
import java.util.Random;
public class Lucky implements OpenMode {
/**
* 请将totalMoney分成count份,保存到ArrayList<Integer>中,返回即可。
*
* @param totalMoney 总金额为方便计算,已经转换为整数,单位为分。
* @param totalCount 红包个数
* @return ArrayList<Integer> 元素为各个红包的金额值,所有元素的值累和等于总金额。
* 子类调用接口方法,方法要重写
*/
@Override
public ArrayList<Integer> divide(int totalMoney, int totalCount) {
// 随机分配,有可能多,有可能少。
// 最少1分钱,最多不超过“剩下金额平均数的2倍”
// 第一次发红包,随机范围是0.01元~6.66元
// 第一次发完之后,剩下的至少是3.34元。
// 此时还需要再发2个红包
// 此时的再发范围应该是0.01元~3.34元(取不到右边,剩下0.01)
//创建集合用来存储每份红包的金额
ArrayList<Integer> arrayList = new ArrayList<>();
//创建随机数对象
Random random = new Random();
//定义两个变量用来存储 剩下的多少钱(金额)和剩余分数
int leftMoney = totalMoney;
int leftCount = totalCount;
//循环遍历,添加元素到数组对象中
for (int i = 0; i < totalCount - 1; i++) {
// 最少1分钱,最多不超过“剩下金额平均数的2倍” 留下一个位置用来存放最后一个红包
int money = random.nextInt(leftMoney / leftCount * 2) - 1;
//将一个随机红包放入集合
arrayList.add(money);
//总金额扣除已分配金额
leftMoney =leftMoney- money;
//红包数目减少
leftCount--;
}
//将最后一个红包放入集合
arrayList.add(leftMoney);
//返回值
return arrayList;
}
}
测试类 这里是通过匿名对象,
更改发送红包的方式在倒数第三行修改setOpenWay的参数即new common()或new Lucky()
package com.peihua.day11;
public class RedPacketTest {
public static void main(String[] args) {
//创建红包对象
RedPacket redPacket=new RedPacket("大红包");
//通过子类对象RedPacket调用父类对象RedPacketFrame红包页面中的setOwnerName方法
redPacket.setOwnerName("小埋"); //
//通过子类对象RedPacket调用父类对象RedPacketFrame红包页面中的setOpenWay方法 (使用匿名对象)
redPacket.setOpenWay(new Lucky());
}
}
测试如下:
普通红包
手气红包