簡單分析
普通紅包參考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());
}
}
測試如下:
普通紅包
手氣紅包