亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

首頁 Java java教程 設(shè)計(jì)一個互聯(lián)網(wǎng)信用購買系統(tǒng)

設(shè)計(jì)一個互聯(lián)網(wǎng)信用購買系統(tǒng)

Jan 15, 2025 pm 06:05 PM

在我面臨的一次技術(shù)面試中,我被要求設(shè)計(jì)一個電子商務(wù)系統(tǒng),允許用戶從第三方提供商處購買互聯(lián)網(wǎng)積分。

自信地,我提出了一個簡單的解決方案:顯示可用的套餐,讓用戶選擇一個,通過外部網(wǎng)關(guān)處理付款,并與提供商交互以提供積分。然而,當(dāng)被問及失敗場景時(例如用戶完成付款后供應(yīng)商缺貨),我意識到我的設(shè)計(jì)缺乏有效處理此類問題的彈性。

幾周前,我對閃購系統(tǒng)和庫存預(yù)訂模式進(jìn)行了研究,特別關(guān)注庫存預(yù)訂策略。限時搶購?fù)ǔP枰獞?yīng)對高需求和有限的庫存,需要復(fù)雜的機(jī)制來維持系統(tǒng)穩(wěn)定性和管理客戶期望。我發(fā)現(xiàn)的一個概念是臨時庫存預(yù)訂,這有助于防止高峰時段超售。

這項(xiàng)研究讓我想起了我的面試經(jīng)歷。我認(rèn)識到應(yīng)用這些庫存預(yù)留策略可以解決我最初設(shè)計(jì)中的缺點(diǎn)。通過在結(jié)帳過程中臨時保留庫存,系統(tǒng)可以有效處理提供商庫存耗盡的情況。

在本研究文檔中,我旨在分享從我的研究中獲得的見解,并提出一種設(shè)計(jì)互聯(lián)網(wǎng)信用購買系統(tǒng)的改進(jìn)方法。通過整合庫存預(yù)留策略,我們可以構(gòu)建一個既強(qiáng)大又用戶友好的平臺,能夠處理各種故障場景,同時提供無縫體驗(yàn)。

1. 關(guān)鍵設(shè)計(jì)考慮因素

在設(shè)計(jì)互聯(lián)網(wǎng)信用購買系統(tǒng)時,需要考慮幾個關(guān)鍵因素,以確保無縫、安全和愉快的用戶體驗(yàn)。讓我們來分解一下:

1.1 配額管理

  • 實(shí)時配額驗(yàn)證:系統(tǒng)應(yīng)立即檢查互聯(lián)網(wǎng)積分包是否有庫存,這樣用戶就不會意外選擇不可用的選項(xiàng)。
  • 臨時配額保留:添加短期保留所選套餐的機(jī)制,讓用戶有足夠的時間完成購買,而不會有丟失物品的風(fēng)險。
  • 處理配額沖突:制定策略來管理多個用戶嘗試同時購買同一套餐的情況,確保公平分配。
  • 包裹信息的緩存管理:保持緩存數(shù)據(jù)準(zhǔn)確且最新,以便用戶始終看到正確的詳細(xì)信息和可用性。

1.2 付款處理

  • 安全付款處理:實(shí)施強(qiáng)大的安全措施來保護(hù)用戶在交易過程中的付款詳細(xì)信息。
  • 用于支付保護(hù)的托管系統(tǒng):使用托管服務(wù)來持有資金,直到積分交付,確保買家和提供商的安全。
  • 支付網(wǎng)關(guān)集成:確保系統(tǒng)與可靠的支付網(wǎng)關(guān)順暢連接,確保交易無憂。
  • 退款機(jī)制:創(chuàng)建清晰且用戶友好的流程,以便在付款失敗或取消時發(fā)放退款。

1.3 提供商集成

  • 系統(tǒng)可用性:與擁有可靠系統(tǒng)的提供商合作,以確保購買過程不會中斷。
  • API 可靠性:與提供穩(wěn)定、記錄完善的 API 的提供商合作,以實(shí)現(xiàn)無縫集成。
  • 服務(wù)激活驗(yàn)證:包括檢查以確認(rèn)購買的積分是否已正確且及時地激活。
  • 錯誤處理和重試:實(shí)施協(xié)議來快速捕獲和解決錯誤,并為任何失敗的進(jìn)程提供重試機(jī)制。

1.4 交易安全

  • 資金流向控制:確保資金僅在交易成功完成后才釋放。
  • 交易一致性:保持所有交易的記錄準(zhǔn)確一致,以防止錯誤。
  • 回滾機(jī)制:制定計(jì)劃在出現(xiàn)??問題時恢復(fù)交易,保護(hù)用戶和系統(tǒng)。
  • 審核跟蹤:維護(hù)詳細(xì)的日志,以幫助有效監(jiān)控和解決任何問題。

1.5 用戶體驗(yàn)

  • 清晰的錯誤消息:為用戶提供易于理解且信息豐富的錯誤消息,以指導(dǎo)他們解決遇到的任何問題。
  • 交易狀態(tài)可見性:讓用戶輕松實(shí)時跟蹤購買狀態(tài),提高透明度。
  • 快速加載包:優(yōu)化系統(tǒng),快速加載可用的包,減少用戶等待時間。
  • 實(shí)時更新:及時通知用戶其交易或可用套餐的任何更改或更新。

通過考慮這些因素,我們可以設(shè)計(jì)一個高效、安全、用戶友好的互聯(lián)網(wǎng)信用購買系統(tǒng),從而提高用戶滿意度和信任度。

2. 系統(tǒng)設(shè)計(jì)及流程

基于上述基本考慮因素,下一步是將這些原則轉(zhuǎn)化為穩(wěn)健且有效的系統(tǒng)設(shè)計(jì)。通過仔細(xì)規(guī)劃各個組件之間的交互,我們可以確保系統(tǒng)不僅滿足功能需求,而且在保持可靠性和可擴(kuò)展性的同時提供無縫的用戶體驗(yàn)。

在本節(jié)中,我們將深入研究系統(tǒng)的架構(gòu)和流程,展示配額管理、支付處理和服務(wù)激活等核心功能是如何緊密結(jié)合實(shí)現(xiàn)的。目的是強(qiáng)調(diào)每種設(shè)計(jì)選擇如何有助于解決潛在挑戰(zhàn)并提供可靠的電子商務(wù)信用購買平臺。

讓我們首先概述系統(tǒng)流程,通過流程圖可視化,以說明用戶從開始到結(jié)束如何與系統(tǒng)交互。

2.1 流程圖

Designing an Internet Credit Purchase System

為了清晰起見,系統(tǒng)流程分為六個階段:

封裝選擇階段

  • 首先,用戶訪問包選擇頁面,應(yīng)用程序從緩存中獲取包數(shù)據(jù)。此數(shù)據(jù)包括可用的包及其緩存的配額信息,然后顯示給用戶。
  • 用戶選擇一個套餐并點(diǎn)擊“購買”。
  • 如果該套餐的配額不可用,應(yīng)用程序會顯示“不可用”消息并將用戶帶回選擇頁面。否則,系統(tǒng)會暫時為該用戶保留配額。

購買啟動

  • 接下來,系統(tǒng)會嘗試為所選套餐保留配額。
  • 如果預(yù)訂失敗,用戶會看到一條錯誤消息并被重定向回選擇頁面。
  • 如果預(yù)訂成功,用戶將前往付款頁面。
付款階段
  • 在此階段,用戶開始支付流程并被重定向到第三方支付網(wǎng)關(guān)。
  • 應(yīng)用程序等待支付網(wǎng)關(guān)的響應(yīng)(回調(diào))以確認(rèn)付款狀態(tài)。
付款處理
  • 應(yīng)用程序檢查支付網(wǎng)關(guān)的回調(diào)以驗(yàn)證支付:
    • 對于無效回調(diào),系統(tǒng)會記錄問題并停止進(jìn)一步的步驟。
    • 對于有效的回調(diào):
      • 如果支付失?。合到y(tǒng)釋放預(yù)留額度并通知用戶。
      • 如果付款成功:系統(tǒng)驗(yàn)證付款,托管資金,并創(chuàng)建新訂單。
服務(wù)激活
  • 支付成功后,系統(tǒng)會要求提供商激活服務(wù)。
    • 如果激活失?。和泄苜Y金將退還給客戶,并通知他們失敗。
    • 如果激活成功:系統(tǒng)驗(yàn)證激活。
      • 如果驗(yàn)證失敗,客戶將獲得退款。
      • 如果驗(yàn)證成功,托管資金將釋放給提供商,并且客戶會收到通知。
后臺進(jìn)程
  • 定期緩存更新:包數(shù)據(jù)緩存定期更新。
  • 實(shí)時配額更新:配額更改通過 WebSocket 連接進(jìn)行傳達(dá)。

此流程可確保為用戶提供流暢、可靠的體驗(yàn),同時還可以有效管理資源和潛在錯誤。

2.2 時序圖

下面的序列圖有助于說明不同角色和組件之間的交互。

Designing an Internet Credit Purchase System

為了清晰起見,系統(tǒng)流程分為六個階段:

封裝選擇階段

  • 客戶首先訪問套餐選擇頁面。
  • 前端從緩存中檢索包裹數(shù)據(jù),并向客戶顯示所有可用的包裹及其緩存的配額信息。

購買啟動

  • 一旦客戶選擇套餐并點(diǎn)擊“購買”,前端就會向后端發(fā)送購買請求。
  • 后端實(shí)時與提供商檢查所選套餐的配額是否仍然可用。
  • 如果有配額,后臺會向提供商臨時預(yù)留15分鐘。
  • 后端會向前端發(fā)送預(yù)訂確認(rèn)信息,客戶將被重定向到付款頁面。

付款階段

  • 客戶進(jìn)入付款頁面并提交付款詳細(xì)信息。
  • 前端將此信息發(fā)送到后端,后端初始化與支付網(wǎng)關(guān)的支付會話。
  • 支付會話準(zhǔn)備就緒后,后端會與前端共享會話詳細(xì)信息。
  • 前端將客戶重定向至支付網(wǎng)關(guān)以完成付款。

付款處理

  • 在支付網(wǎng)關(guān),客戶輸入付款信息并完成付款流程。
  • 支付網(wǎng)關(guān)通過回調(diào)通知后端支付狀態(tài):
    • 如果付款成功:
      • 后端與支付網(wǎng)關(guān)驗(yàn)證支付狀態(tài)。
      • 付款被托管,后端確認(rèn)托管。
    • 如果付款失?。?
      • 后端釋放與提供商的預(yù)留配額,并更新付款狀態(tài)以反映失敗。
    • 如果在預(yù)計(jì)時間內(nèi)沒有收到回調(diào):
      • 后端定期輪詢支付網(wǎng)關(guān)以檢查支付狀態(tài)。如果支付失敗或者超時,后臺會釋放預(yù)留額度。

服務(wù)激活

  • 支付成功,后臺請求提供商開通服務(wù)。
  • 提供商響應(yīng)激活狀態(tài),后端驗(yàn)證激活:
    • 如果激活成功:
      • 后端將付款從托管釋放給提供商。
      • 成功通知會發(fā)送給客戶,讓他們知道服務(wù)已準(zhǔn)備就緒。
    • 如果激活失?。?
      • 后臺將托管資金退還給客戶。
      • 發(fā)送失敗通知以告知客戶該問題。

后臺進(jìn)程

  • 提供商通過 WebSocket 連接向后端發(fā)送有關(guān)包裹配額的實(shí)時更新。
  • 這些更新確保緩存始終是最新的,因此客戶在瀏覽時可以看到最準(zhǔn)確的軟件包可用性。

三、技術(shù)實(shí)現(xiàn)

現(xiàn)在我們已經(jīng)概述了系統(tǒng)的流程和交互,是時候深入研究它們?nèi)绾卧诖a中組合在一起了。本節(jié)逐步分解實(shí)現(xiàn),展示如何將設(shè)計(jì)轉(zhuǎn)化為工作部件,處理從管理訂單到與提供商和支付系統(tǒng)交互的所有事務(wù)。

// Domain Models
@Getter @Setter
@Entity
public class Package {
    @Id
    private String id;
    private String name;
    private BigDecimal price;
    private BigDecimal providerCost;
    private String description;
    private boolean active;
}

@Getter @Setter
@Entity
public class Order {
    @Id
    private String id;
    private String customerId;
    private String packageId;
    private String reservationId;
    private String paymentId;
    private String escrowId;
    private OrderStatus status;
    private BigDecimal amount;
    private BigDecimal providerCost;
    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;
}

@Getter @Setter
@Entity
public class QuotaReservation {
    @Id
    private String id;
    private String packageId;
    private LocalDateTime expiresAt;
    private ReservationStatus status;
}

// Enums
public enum OrderStatus {
    CREATED, RESERVED, PAYMENT_PENDING, PAYMENT_COMPLETED, 
    IN_ESCROW, ACTIVATING, ACTIVATION_FAILED, COMPLETED, REFUNDED
}

public enum ReservationStatus {
    ACTIVE, EXPIRED, USED, CANCELLED
}

這些類的作用如下:

  • 套餐:這是我們定義用戶可以購買的互聯(lián)網(wǎng)積分套餐的地方。它會跟蹤包 ID、名稱、價格、提供商成本、描述以及包是否處于活動狀態(tài)等詳細(xì)信息。

  • 訂單:將此視為用戶購買的記錄。它包括訂單 ID、客戶 ID、所選套餐 ID 等信息,以及預(yù)訂 ID、付款 ID、托管 ID、訂單狀態(tài)、付款金額、提供商成本和時間戳等相關(guān)詳細(xì)信息。

  • QuotaReservation:處理套餐配額的臨時預(yù)訂。它記錄預(yù)訂 ID、所綁定的套餐、過期時間及其當(dāng)前狀態(tài)(如有效或過期)。

  • OrderStatus 枚舉:此枚舉列出了訂單可能經(jīng)歷的所有可能階段,從 CREATED 和 RESERVED 到 PAYMENT_PENDING、COMPLETED 甚至 REFUNDED。

  • ReservationStatus 枚舉:同樣,此枚舉跟蹤配額預(yù)留的狀態(tài),無論是活動、過期、已使用還是已取消。

這些類和枚舉共同構(gòu)建了系統(tǒng)中管理包裹、訂單和配額預(yù)留的主干。這是一種有效處理電子商務(wù)功能的簡單而結(jié)構(gòu)化的方法。

// Request/Response DTOs
@Getter @Setter
public class OrderRequest {
    private String customerId;
    private String packageId;
    private BigDecimal amount;
}

@Getter @Setter
public class PaymentCallback {
    private String orderId;
    private String paymentId;
    private String status;
    private BigDecimal amount;
    private LocalDateTime timestamp;
}

@Getter @Setter
public class QuotaResponse {
    private String packageId;
    private boolean available;
    private Integer remainingQuota;
    private LocalDateTime timestamp;
}

@Getter @Setter
public class ReservationResponse {
    private String id;
    private String packageId;
    private LocalDateTime expiresAt;
    private ReservationStatus status;
}

@Getter @Setter
public class ActivationResponse {
    private String orderId;
    private boolean success;
    private String activationId;
    private String errorCode;
    private String errorMessage;
}

@Getter @Setter
public class VerificationResponse {
    private String orderId;
    private String activationId;
    private boolean success;
    private String status;
    private LocalDateTime activatedAt;
}

@Getter @Setter
public class PaymentRequest {
    private String orderId;
    private BigDecimal amount;
    private String currency;
    private String customerId;
    private String returnUrl;
    private String callbackUrl;
}

@Getter @Setter
public class PaymentSession {
    private String sessionId;
    private String paymentUrl;
    private LocalDateTime expiresAt;
    private String status;
}

@Getter @Setter
public class EscrowResponse {
    private String id;
    private String paymentId;
    private BigDecimal amount;
    private String status;
    private LocalDateTime createdAt;
}

讓我們來分解一下:

  • OrderRequest:這都是關(guān)于創(chuàng)建新訂單所需的數(shù)據(jù)。它包括客戶 ID、他們想要購買的套餐以及他們將支付的總金額。

  • PaymentCallback:將此視為來自支付網(wǎng)關(guān)的通知。嘗試付款后,它會提供訂單 ID、付款 ID、狀態(tài)(成功或失?。?、支付金額以及付款時間等詳細(xì)信息。

  • QuotaResponse:這是關(guān)于檢查可用性的。它告訴我們套餐是否可用、剩余配額以及信息上次更新的時間。

  • ReservationResponse:預(yù)訂套餐后,這將為您提供所有詳細(xì)信息:預(yù)訂 ID、關(guān)聯(lián)的套餐、預(yù)訂何時到期以及其當(dāng)前狀態(tài)(例如有效或已過期) .

  • ActivationResponse:這告訴我們服務(wù)激活的情況。如果成功或失敗,如果出現(xiàn)問題,它會向我們提供激活 ID 和錯誤詳細(xì)信息。

  • VerificationResponse:激活后,我們驗(yàn)證一切是否順利。其中包括訂單 ID、激活 ID、成功狀態(tài)以及激活時間。

  • PaymentRequest:在開始付款流程之前,此 DTO 會收集必要的詳細(xì)信息,例如訂單 ID、要支付的金額、貨幣、客戶 ID 和回調(diào) URL。

  • PaymentSession:這是付款流程開始時創(chuàng)建的內(nèi)容。它包括會話 ID、支付 URL(用戶去支付的地方)、過期時間以及會話狀態(tài)。

  • EscrowResponse:如果資金被托管,這會告訴我們所有相關(guān)信息,例如托管 ID、付款 ID、持有金額、狀態(tài)以及創(chuàng)建時間。

所有這些類都定義了系統(tǒng)不同部分之間通信的構(gòu)建塊——無論是發(fā)出請求還是返回響應(yīng)。他們確保每個人(和所有事物)都在同一頁面上。

// Domain Models
@Getter @Setter
@Entity
public class Package {
    @Id
    private String id;
    private String name;
    private BigDecimal price;
    private BigDecimal providerCost;
    private String description;
    private boolean active;
}

@Getter @Setter
@Entity
public class Order {
    @Id
    private String id;
    private String customerId;
    private String packageId;
    private String reservationId;
    private String paymentId;
    private String escrowId;
    private OrderStatus status;
    private BigDecimal amount;
    private BigDecimal providerCost;
    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;
}

@Getter @Setter
@Entity
public class QuotaReservation {
    @Id
    private String id;
    private String packageId;
    private LocalDateTime expiresAt;
    private ReservationStatus status;
}

// Enums
public enum OrderStatus {
    CREATED, RESERVED, PAYMENT_PENDING, PAYMENT_COMPLETED, 
    IN_ESCROW, ACTIVATING, ACTIVATION_FAILED, COMPLETED, REFUNDED
}

public enum ReservationStatus {
    ACTIVE, EXPIRED, USED, CANCELLED
}
緩存服務(wù)
1. 目的:

該服務(wù)負(fù)責(zé)存儲包數(shù)據(jù)的本地緩存。目標(biāo)是使系統(tǒng)更快并減少對提供商 API 的不必要調(diào)用。

2. 主要特點(diǎn):
  • updateCache():此方法通過從提供程序獲取所有包數(shù)據(jù),每 5 分鐘刷新一次本地緩存。它確保緩存保持最新。
  • getPackage():此方法使用其 ID 從緩存中檢索包信息。
  • updatePackageQuota():當(dāng)配額詳細(xì)信息發(fā)生更改時,此方法會使用特定包的新信息更新緩存。
提供商整合
1. 目的:

此服務(wù)處理與提供商的 API 的通信。它管理諸如檢查配額、預(yù)訂套餐、激活服務(wù)和驗(yàn)證這些激活等任務(wù)。

2. 主要特點(diǎn):
  • checkQuota():此方法通過調(diào)用提供商的 API 來檢查包是否有足夠的可用配額。
  • ReserveQuota():它通過向提供商發(fā)送請求來為客戶保留包裹的配額。
  • activateService():當(dāng)需要為訂單激活服務(wù)時,此方法將處理對提供者的請求。
  • verifyActivation():激活后,此方法確認(rèn)是否一切成功。
  • getAllPackages():此方法從提供者檢索所有可用的包,這對于更新緩存或向用戶顯示包選項(xiàng)非常有用。
3、重試機(jī)制:

當(dāng)出現(xiàn)臨時問題時,該服務(wù)使用 RetryTemplate 自動重試對提供商 API 的請求。這確保了系統(tǒng)即使在出現(xiàn)輕微問題時也能保持可靠和彈性。

通過組合這些功能,此代碼可確保系統(tǒng)有效地管理包數(shù)據(jù),同時保持與提供商的 API 的順暢且可靠的通信。

// Domain Models
@Getter @Setter
@Entity
public class Package {
    @Id
    private String id;
    private String name;
    private BigDecimal price;
    private BigDecimal providerCost;
    private String description;
    private boolean active;
}

@Getter @Setter
@Entity
public class Order {
    @Id
    private String id;
    private String customerId;
    private String packageId;
    private String reservationId;
    private String paymentId;
    private String escrowId;
    private OrderStatus status;
    private BigDecimal amount;
    private BigDecimal providerCost;
    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;
}

@Getter @Setter
@Entity
public class QuotaReservation {
    @Id
    private String id;
    private String packageId;
    private LocalDateTime expiresAt;
    private ReservationStatus status;
}

// Enums
public enum OrderStatus {
    CREATED, RESERVED, PAYMENT_PENDING, PAYMENT_COMPLETED, 
    IN_ESCROW, ACTIVATING, ACTIVATION_FAILED, COMPLETED, REFUNDED
}

public enum ReservationStatus {
    ACTIVE, EXPIRED, USED, CANCELLED
}
支付網(wǎng)關(guān)集成

此類在管理系統(tǒng)如何與支付網(wǎng)關(guān)交互以順利、安全地處理金融交易方面發(fā)揮著關(guān)鍵作用。

1.初始化Payment(PaymentRequest請求):
  • 將此視為付款流程的開始。它向支付網(wǎng)關(guān)發(fā)送包含所有支付詳細(xì)信息的請求。
  • 它返回一個 PaymentSession 對象,其中包含付款 URL 和會話狀態(tài)等信息。
2.holdInEscrow(String paymentId):
  • 此方法使用給定的付款 ID 保護(hù)托管帳戶中的付款。
  • 它提供了一個 EscrowResponse 對象,其中包含有關(guān)托管資金的所有詳細(xì)信息。
3.releaseToProvider(String escrowId):
  • 服務(wù)成功激活后,此方法將托管資金釋放給服務(wù)提供商。
  • 托管 ID 用于識別和釋放正確的資金。
4.refundToCustomer(String escrowId):
  • 如果出現(xiàn)問題,例如服務(wù)激活失敗,此方法會將托管資金退還給客戶。
  • 它使用托管 ID 來處理退款。
主要特點(diǎn):
  • 該類使用 WebClient 向支付網(wǎng)關(guān)的 REST API 發(fā)送 HTTP 請求,確保無縫集成。
  • 它處理關(guān)鍵操作,例如開始付款、管理托管和處理退款。
  • 所有方法都使用同步調(diào)用(通過 .block())來確保操作在繼續(xù)之前完成,從而確??煽啃?。

在管理系統(tǒng)中安全高效的金融交易時,此類是拼圖的關(guān)鍵部分。

// Domain Models
@Getter @Setter
@Entity
public class Package {
    @Id
    private String id;
    private String name;
    private BigDecimal price;
    private BigDecimal providerCost;
    private String description;
    private boolean active;
}

@Getter @Setter
@Entity
public class Order {
    @Id
    private String id;
    private String customerId;
    private String packageId;
    private String reservationId;
    private String paymentId;
    private String escrowId;
    private OrderStatus status;
    private BigDecimal amount;
    private BigDecimal providerCost;
    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;
}

@Getter @Setter
@Entity
public class QuotaReservation {
    @Id
    private String id;
    private String packageId;
    private LocalDateTime expiresAt;
    private ReservationStatus status;
}

// Enums
public enum OrderStatus {
    CREATED, RESERVED, PAYMENT_PENDING, PAYMENT_COMPLETED, 
    IN_ESCROW, ACTIVATING, ACTIVATION_FAILED, COMPLETED, REFUNDED
}

public enum ReservationStatus {
    ACTIVE, EXPIRED, USED, CANCELLED
}
通知 DTO
1. 電子郵件通知:
  • 將此視為發(fā)送電子郵件通知的藍(lán)圖。它包括:
    • 收件人的電子郵件 (to)。
    • 電子郵件的主題。
    • 用于確定格式的模板 ID。
    • 用于個性化內(nèi)容的動態(tài)數(shù)據(jù)(templateData)。
2.短信通知:
  • 類似于電子郵件通知,但針對短信量身定制。它包括:
    • 收件人的電話號碼 (phoneNumber)。
    • 消息格式的模板 ID。
    • 用于個性化的動態(tài)數(shù)據(jù)(templateData)。
通知服務(wù)

此服務(wù)處理發(fā)送給用戶的有關(guān)訂單狀態(tài)的所有通知。其工作原理如下:

1.sendSuccessNotification(訂單訂單):
  • 此方法處理發(fā)送成功通知。它使用:
    • buildSuccessEmail 用于創(chuàng)建電子郵件通知。
    • buildSuccessSms 用于創(chuàng)建短信通知。
    • 它還使用 QuotaWebSocketHandler 通過 WebSocket 發(fā)送實(shí)時更新。
2.sendFailureNotification(訂單順序):
  • 這個負(fù)責(zé)處理失敗通知。它使用:
    • buildFailureEmail 用于電子郵件。
    • buildFailureSms 用于短信。
    • 與成功通知一樣,它也會發(fā)送 WebSocket 更新。
3. 輔助方法:
  • buildSuccessEmail 和 buildFailureEmail:這些方法根據(jù)訂單是成功還是失敗創(chuàng)建電子郵件通知。他們使用模板和訂單詳細(xì)信息。
  • buildSuccessSms 和 buildFailureSms:它們的作用相同,但用于短信通知。
附加功能:
  • WebSocket 更新:使用 QuotaWebSocketHandler 保持前端實(shí)時更新。
  • 錯誤記錄:如果出現(xiàn)問題,它會記錄錯誤以供調(diào)試。

這項(xiàng)服務(wù)可確保用戶始終了解其訂單,無論是通過電子郵件、短信還是實(shí)時更新。

// Domain Models
@Getter @Setter
@Entity
public class Package {
    @Id
    private String id;
    private String name;
    private BigDecimal price;
    private BigDecimal providerCost;
    private String description;
    private boolean active;
}

@Getter @Setter
@Entity
public class Order {
    @Id
    private String id;
    private String customerId;
    private String packageId;
    private String reservationId;
    private String paymentId;
    private String escrowId;
    private OrderStatus status;
    private BigDecimal amount;
    private BigDecimal providerCost;
    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;
}

@Getter @Setter
@Entity
public class QuotaReservation {
    @Id
    private String id;
    private String packageId;
    private LocalDateTime expiresAt;
    private ReservationStatus status;
}

// Enums
public enum OrderStatus {
    CREATED, RESERVED, PAYMENT_PENDING, PAYMENT_COMPLETED, 
    IN_ESCROW, ACTIVATING, ACTIVATION_FAILED, COMPLETED, REFUNDED
}

public enum ReservationStatus {
    ACTIVE, EXPIRED, USED, CANCELLED
}
配額更新類
  • 將此類視為配額更新的簡單信使。它攜帶三個關(guān)鍵信息:
    • packageId:正在更新的包的ID。
    • availableQuota: 該包還剩多少配額。
    • 時間戳:更新的時間。
WebSocket 配置
1.WebSocket配置:
  • 這是使 WebSocket 通信成為可能的設(shè)置。
  • 它注冊一個處理程序 (quotaWebSocketHandler) 來偵聽 /ws/quota 處的 WebSocket 連接。
  • 它還可以通過設(shè)置 allowedOrigins("*") 來允許來自任何來源的連接。
2.quotaWebSocketHandler():
  • 這定義了將管理傳入消息和連接的 WebSocket 處理程序 bean。
配額WebSocketHandler

這就是所有 WebSocket 魔法發(fā)生的地方!它管理服務(wù)器和客戶端之間的實(shí)時更新。

1. 領(lǐng)域:
  • PackageCacheService:每當(dāng)配額更新到來時幫助更新本地緩存。
  • ObjectMapper:處理 JSON 有效負(fù)載到 Java 對象的轉(zhuǎn)換,反之亦然。
  • 會話:跟蹤所有活動的 WebSocket 會話(當(dāng)前連接的客戶端)。
2、方法:
  • afterConnectionEstablished(WebSocketSession 會話):
    • 連接后立即將新的客戶端會話添加到活動列表。
  • afterConnectionClosed(WebSocketSession 會話,CloseStatus 狀態(tài)):
    • 斷開連接時刪除客戶端會話。
  • handleTextMessage(WebSocketSession會話,TextMessage消息):
    • 處理傳入消息。
    • 將接收到的 JSON 轉(zhuǎn)換為 QuotaUpdate 對象并更新本地緩存。
3. sendOrderUpdate(訂單順序):
  • 向所有連接的客戶端發(fā)送有關(guān)訂單更改的實(shí)時更新。
  • 將 Order 對象轉(zhuǎn)換為 JSON 并將其作為消息發(fā)送到活動的 WebSocket 會話。
  • 確保只有打開的連接才能收到更新。
該守則的主要特點(diǎn):
  • 實(shí)時更新:
    • 讓客戶立即了解配額變更和訂單更新。
  • 線程安全管理:
    • 使用ConcurrentHashSet處理連接的客戶端,確保多個客戶端處于活動狀態(tài)時不會發(fā)生沖突。
  • 錯誤處理:
    • 發(fā)送消息時出現(xiàn)問題時記錄錯誤,以便更輕松地進(jìn)行故障排除。

此設(shè)置可確保后端和前端之間的順暢和即時通信,因此用戶始終可以獲得有關(guān)配額可用性和訂單狀態(tài)的最新信息。

// Domain Models
@Getter @Setter
@Entity
public class Package {
    @Id
    private String id;
    private String name;
    private BigDecimal price;
    private BigDecimal providerCost;
    private String description;
    private boolean active;
}

@Getter @Setter
@Entity
public class Order {
    @Id
    private String id;
    private String customerId;
    private String packageId;
    private String reservationId;
    private String paymentId;
    private String escrowId;
    private OrderStatus status;
    private BigDecimal amount;
    private BigDecimal providerCost;
    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;
}

@Getter @Setter
@Entity
public class QuotaReservation {
    @Id
    private String id;
    private String packageId;
    private LocalDateTime expiresAt;
    private ReservationStatus status;
}

// Enums
public enum OrderStatus {
    CREATED, RESERVED, PAYMENT_PENDING, PAYMENT_COMPLETED, 
    IN_ESCROW, ACTIVATING, ACTIVATION_FAILED, COMPLETED, REFUNDED
}

public enum ReservationStatus {
    ACTIVE, EXPIRED, USED, CANCELLED
}

以下是這些自定義異常類的詳細(xì)信息以及如何使用它們來處理系統(tǒng)中的特定錯誤場景:

QuotaNotAvailableException

  • 當(dāng)用戶嘗試購買套餐,但該套餐的配額已用完時,會觸發(fā)此異常。
  • 它帶有一條簡單的默認(rèn)消息:“軟件包配額不可用”,因此開發(fā)者和用戶都可以清楚地了解該問題。

OrderNotFoundException

  • 當(dāng)系統(tǒng)無法根據(jù)提供的 orderId 找到訂單時,此功能就會啟動。
  • 它包含詳細(xì)的錯誤消息,例如“未找到訂單:[orderId]”,可以輕松準(zhǔn)確地查明丟失的訂單。

PaymentVerificationException

  • 如果驗(yàn)證付款時出現(xiàn)問題(可能金額不匹配,或者付款狀態(tài)不清楚),則會拋出此異常。
  • 它允許您傳遞自定義消息,增加診斷付款問題的靈活性和上下文。

通過使用這些異常,系統(tǒng)以干凈且可預(yù)測的方式處理錯誤。它們不僅可以提高開發(fā)人員的調(diào)試效率,還可以確保用戶在出現(xiàn)問題時收到清晰且可操作的反饋。

// Request/Response DTOs
@Getter @Setter
public class OrderRequest {
    private String customerId;
    private String packageId;
    private BigDecimal amount;
}

@Getter @Setter
public class PaymentCallback {
    private String orderId;
    private String paymentId;
    private String status;
    private BigDecimal amount;
    private LocalDateTime timestamp;
}

@Getter @Setter
public class QuotaResponse {
    private String packageId;
    private boolean available;
    private Integer remainingQuota;
    private LocalDateTime timestamp;
}

@Getter @Setter
public class ReservationResponse {
    private String id;
    private String packageId;
    private LocalDateTime expiresAt;
    private ReservationStatus status;
}

@Getter @Setter
public class ActivationResponse {
    private String orderId;
    private boolean success;
    private String activationId;
    private String errorCode;
    private String errorMessage;
}

@Getter @Setter
public class VerificationResponse {
    private String orderId;
    private String activationId;
    private boolean success;
    private String status;
    private LocalDateTime activatedAt;
}

@Getter @Setter
public class PaymentRequest {
    private String orderId;
    private BigDecimal amount;
    private String currency;
    private String customerId;
    private String returnUrl;
    private String callbackUrl;
}

@Getter @Setter
public class PaymentSession {
    private String sessionId;
    private String paymentUrl;
    private LocalDateTime expiresAt;
    private String status;
}

@Getter @Setter
public class EscrowResponse {
    private String id;
    private String paymentId;
    private BigDecimal amount;
    private String status;
    private LocalDateTime createdAt;
}

OrderService 類處理管理訂單時的繁重工作。讓我們來看看它是如何工作的:

主要職責(zé)
  1. createOrder(OrderRequest 請求):

    • 這個方法主要是創(chuàng)建一個新訂單。它檢查包裹是否可用,獲取詳細(xì)信息,保留配額,并將訂單保存到數(shù)據(jù)庫,初始狀態(tài)為 RESERVED。
  2. processPayment(String orderId, PaymentCallback 回調(diào)):

    • 在這里,付款被處理。系統(tǒng)驗(yàn)證付款詳細(xì)信息、更新訂單、將付款托管并啟動服務(wù)激活流程。如果出現(xiàn)問題,它會優(yōu)雅地管理失敗。
  3. 驗(yàn)證激活(訂單順序):

    • 此方法會仔細(xì)檢查服務(wù)激活是否順利。它最多嘗試 3 次,如果仍然失敗,系統(tǒng)會回退來處理失敗。
  4. completeOrder(訂單順序):

    • 一旦一切檢查完畢,此方法就會最終確定訂單。它將托管資金釋放給提供商,更新狀態(tài),并通知用戶成功。
  5. handleActivationFailure(訂單順序):

    • 如果激活失敗,此方法可確??蛻臬@得退款并收到有關(guān)問題所在的通知。
  6. getOrder(String orderId):

    • 這個簡單的方法通過 ID 檢索訂單。如果訂單不存在,則會拋出特定異常。
為什么它有效
  • 由于其事務(wù)性質(zhì),它確保事務(wù)完成或回滾。
  • 通過清晰的錯誤處理和重試,它足夠強(qiáng)大,可以處理現(xiàn)實(shí)世界中的問題。
  • 通知讓用戶隨時了解每一步的情況。

此服務(wù)是訂單管理流程的支柱,將所有內(nèi)容結(jié)合在一起以提供無縫的用戶體驗(yàn)。

// Domain Models
@Getter @Setter
@Entity
public class Package {
    @Id
    private String id;
    private String name;
    private BigDecimal price;
    private BigDecimal providerCost;
    private String description;
    private boolean active;
}

@Getter @Setter
@Entity
public class Order {
    @Id
    private String id;
    private String customerId;
    private String packageId;
    private String reservationId;
    private String paymentId;
    private String escrowId;
    private OrderStatus status;
    private BigDecimal amount;
    private BigDecimal providerCost;
    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;
}

@Getter @Setter
@Entity
public class QuotaReservation {
    @Id
    private String id;
    private String packageId;
    private LocalDateTime expiresAt;
    private ReservationStatus status;
}

// Enums
public enum OrderStatus {
    CREATED, RESERVED, PAYMENT_PENDING, PAYMENT_COMPLETED, 
    IN_ESCROW, ACTIVATING, ACTIVATION_FAILED, COMPLETED, REFUNDED
}

public enum ReservationStatus {
    ACTIVE, EXPIRED, USED, CANCELLED
}

OrderController 類負(fù)責(zé)管理系統(tǒng)中訂單的 REST API 端點(diǎn)。 Think 是發(fā)出請求的客戶端和執(zhí)行繁重任務(wù)的后端服務(wù)之間的橋梁。

關(guān)鍵端點(diǎn)
  1. POST /api/orders (createOrder):

    • 此端點(diǎn)處理創(chuàng)建新訂單。
    • 發(fā)生的事情是這樣的:
      • 它接收來自客戶端的 OrderRequest。
      • 調(diào)用 OrderService.createOrder 處理請求并創(chuàng)建訂單。
      • 發(fā)回:
        • 如果一切順利,新創(chuàng)建的訂單將收到 200 OK 響應(yīng)。
        • 如果包配額不可用,則會出現(xiàn) 409 沖突。
        • 任何意外問題都會出現(xiàn) 500 內(nèi)部服務(wù)器錯誤。
  2. POST /api/orders/callback (handlePaymentCallback):

    • 此處理由支付網(wǎng)關(guān)發(fā)送的付款更新。
    • 流程如下:
      • 它收到一個包含所有付款詳細(xì)信息的 PaymentCallback。
      • 調(diào)用 OrderService.processPayment 處理付款并更新訂單狀態(tài)。
      • 可能的響應(yīng)是:
        • 200 OK 如果付款成功處理。
        • 如果提供的訂單 ID 不存在,則返回 404 Not Found。
        • 422 如果付款驗(yàn)證不匹配,則無法處理實(shí)體。
        • 500 內(nèi)部服務(wù)器錯誤,出現(xiàn)任何意外情況。
  3. GET /api/orders/{orderId} (getOrder):

    • 此端點(diǎn)通過 ID 獲取特定訂單的詳細(xì)信息。
    • 其工作原理如下:
      • 它調(diào)用 OrderService.getOrder 來檢索訂單。
      • 返回:
        • 如果找到的話,會給出 200 OK 響應(yīng)以及訂單詳細(xì)信息。
        • 如果訂單 ID 與任何記錄都不匹配,則會出現(xiàn) 404 Not Found。
特征
  • 關(guān)注點(diǎn)分離:OrderController 將所有業(yè)務(wù)邏輯委托給 OrderService,保持事物干凈且集中。
  • 驗(yàn)證:使用@Valid注釋驗(yàn)證請求有效負(fù)載,以確保傳入的數(shù)據(jù)符合預(yù)期。
  • 錯誤處理:
    • 針對常見問題(例如配額不可用或訂單缺失)提供具體且有用的響應(yīng)。
    • 記錄任何問題以使調(diào)試更容易。
  • 日志記錄:跟蹤傳入請求、錯誤和訂單詳細(xì)信息等關(guān)鍵事件,以提高可見性。

該控制器確保客戶端和后端無縫通信,使訂單管理盡可能順利。

結(jié)論

本研究文檔為設(shè)計(jì)電子商務(wù)信用銷售系統(tǒng)、解決配額管理、支付處理和服務(wù)激活等重要挑戰(zhàn)奠定了基礎(chǔ)。雖然此設(shè)計(jì)涵蓋了基礎(chǔ)知識,但總有改進(jìn)的空間!

以下是改進(jìn)此設(shè)計(jì)的一些想法:

  • 使用事件驅(qū)動架構(gòu)使系統(tǒng)更加靈活和可擴(kuò)展。
  • 添加基于消息隊(duì)列的處理以順利處理大量交易。
  • 探索高級緩存策略以加快速度并減少對外部 API 的依賴。
  • 考慮分布式系統(tǒng)模式以更輕松地?cái)U(kuò)展和更好的可靠性。
  • 實(shí)施斷路器以優(yōu)雅地處理第三方服務(wù)問題。
  • 設(shè)置監(jiān)控和警報(bào)以盡早發(fā)現(xiàn)問題并快速修復(fù)。
  • 加強(qiáng)安全措施以保護(hù)用戶及其數(shù)據(jù)。

非常感謝您的閱讀!我希望本文檔有用,并為探索類似挑戰(zhàn)的任何人提供清晰的思路。當(dāng)然,這種設(shè)計(jì)并不完美——總有改進(jìn)的空間。如果您有任何想法或建議,我很想聽聽。

資源:

  • 深入探討簡潔架構(gòu)和 SOLID 原則
  • 使用微服務(wù)架構(gòu)設(shè)計(jì)電子商務(wù)應(yīng)用程序
  • 為閃購設(shè)計(jì)可擴(kuò)展的后端
  • 維基百科上的托管

以上是設(shè)計(jì)一個互聯(lián)網(wǎng)信用購買系統(tǒng)的詳細(xì)內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
現(xiàn)代爪哇的異步編程技術(shù) 現(xiàn)代爪哇的異步編程技術(shù) Jul 07, 2025 am 02:24 AM

Java支持異步編程的方式包括使用CompletableFuture、響應(yīng)式流(如ProjectReactor)以及Java19 中的虛擬線程。1.CompletableFuture通過鏈?zhǔn)秸{(diào)用提升代碼可讀性和維護(hù)性,支持任務(wù)編排和異常處理;2.ProjectReactor提供Mono和Flux類型實(shí)現(xiàn)響應(yīng)式編程,具備背壓機(jī)制和豐富的操作符;3.虛擬線程減少并發(fā)成本,適用于I/O密集型任務(wù),與傳統(tǒng)平臺線程相比更輕量且易于擴(kuò)展。每種方式均有適用場景,應(yīng)根據(jù)需求選擇合適工具并避免混合模型以保持簡潔性

在Java中使用枚舉的最佳實(shí)踐 在Java中使用枚舉的最佳實(shí)踐 Jul 07, 2025 am 02:35 AM

在Java中,枚舉(enum)適合表示固定常量集合,最佳實(shí)踐包括:1.用enum表示固定狀態(tài)或選項(xiàng),提升類型安全和可讀性;2.為枚舉添加屬性和方法以增強(qiáng)靈活性,如定義字段、構(gòu)造函數(shù)、輔助方法等;3.使用EnumMap和EnumSet提高性能和類型安全性,因其基于數(shù)組實(shí)現(xiàn)更高效;4.避免濫用enum,如動態(tài)值、頻繁變更或復(fù)雜邏輯場景應(yīng)使用其他方式替代。正確使用enum能提升代碼質(zhì)量并減少錯誤,但需注意其適用邊界。

了解Java Nio及其優(yōu)勢 了解Java Nio及其優(yōu)勢 Jul 08, 2025 am 02:55 AM

JavaNIO是Java1.4引入的新型IOAPI,1)面向緩沖區(qū)和通道,2)包含Buffer、Channel和Selector核心組件,3)支持非阻塞模式,4)相比傳統(tǒng)IO更高效處理并發(fā)連接。其優(yōu)勢體現(xiàn)在:1)非阻塞IO減少線程開銷,2)Buffer提升數(shù)據(jù)傳輸效率,3)Selector實(shí)現(xiàn)多路復(fù)用,4)內(nèi)存映射加快文件讀寫。使用時需注意:1)Buffer的flip/clear操作易混淆,2)非阻塞下需手動處理不完整數(shù)據(jù),3)Selector注冊需及時取消,4)NIO并非適用于所有場景。

Java Classloader在內(nèi)部如何工作 Java Classloader在內(nèi)部如何工作 Jul 06, 2025 am 02:53 AM

Java的類加載機(jī)制通過ClassLoader實(shí)現(xiàn),其核心工作流程分為加載、鏈接和初始化三個階段。加載階段由ClassLoader動態(tài)讀取類的字節(jié)碼并創(chuàng)建Class對象;鏈接包括驗(yàn)證類的正確性、為靜態(tài)變量分配內(nèi)存及解析符號引用;初始化則執(zhí)行靜態(tài)代碼塊和靜態(tài)變量賦值。類加載采用雙親委派模型,優(yōu)先委托父類加載器查找類,依次嘗試Bootstrap、Extension和ApplicationClassLoader,確保核心類庫安全且避免重復(fù)加載。開發(fā)者可自定義ClassLoader,如URLClassL

有效處理常見的Java例外 有效處理常見的Java例外 Jul 05, 2025 am 02:35 AM

Java異常處理的關(guān)鍵在于區(qū)分checked和unchecked異常并合理使用try-catch、finally及日志記錄。1.checked異常如IOException需強(qiáng)制處理,適用于可預(yù)期的外部問題;2.unchecked異常如NullPointerException通常由程序邏輯錯誤引起,屬于運(yùn)行時錯誤;3.捕獲異常時應(yīng)具體明確,避免籠統(tǒng)捕獲Exception;4.推薦使用try-with-resources自動關(guān)閉資源,減少手動清理代碼;5.異常處理中應(yīng)結(jié)合日志框架記錄詳細(xì)信息,便于后

Hashmap在Java內(nèi)部如何工作? Hashmap在Java內(nèi)部如何工作? Jul 15, 2025 am 03:10 AM

HashMap在Java中通過哈希表實(shí)現(xiàn)鍵值對存儲,其核心在于快速定位數(shù)據(jù)位置。1.首先使用鍵的hashCode()方法生成哈希值,并通過位運(yùn)算轉(zhuǎn)換為數(shù)組索引;2.不同對象可能產(chǎn)生相同哈希值,導(dǎo)致沖突,此時以鏈表形式掛載節(jié)點(diǎn),JDK8后鏈表過長(默認(rèn)長度8)則轉(zhuǎn)為紅黑樹提升效率;3.使用自定義類作鍵時必須重寫equals()和hashCode()方法;4.HashMap動態(tài)擴(kuò)容,當(dāng)元素?cái)?shù)超過容量乘以負(fù)載因子(默認(rèn)0.75)時,擴(kuò)容并重新哈希;5.HashMap非線程安全,多線程下應(yīng)使用Concu

解釋:面向?qū)ο蟮木幊讨械腏ava多態(tài)性 解釋:面向?qū)ο蟮木幊讨械腏ava多態(tài)性 Jul 05, 2025 am 02:52 AM

多態(tài)是Java面向?qū)ο缶幊痰暮诵奶匦灾?,其核心在于“一個接口,多種實(shí)現(xiàn)”,它通過繼承、方法重寫和向上轉(zhuǎn)型實(shí)現(xiàn)統(tǒng)一接口處理不同對象的行為。1.多態(tài)允許父類引用指向子類對象,運(yùn)行時根據(jù)實(shí)際對象調(diào)用對應(yīng)方法;2.實(shí)現(xiàn)需滿足繼承關(guān)系、方法重寫和向上轉(zhuǎn)型三個條件;3.常用于統(tǒng)一處理不同子類對象、集合存儲及框架設(shè)計(jì)中;4.使用時只能調(diào)用父類定義的方法,子類新增方法需向下轉(zhuǎn)型訪問,并注意類型安全。

有效使用爪哇枚舉和最佳實(shí)踐 有效使用爪哇枚舉和最佳實(shí)踐 Jul 07, 2025 am 02:43 AM

Java枚舉不僅表示常量,還可封裝行為、攜帶數(shù)據(jù)、實(shí)現(xiàn)接口。1.枚舉是類,用于定義固定實(shí)例,如星期、狀態(tài),比字符串或整數(shù)更安全;2.可攜帶數(shù)據(jù)和方法,如通過構(gòu)造函數(shù)傳值并提供訪問方法;3.可使用switch處理不同邏輯,結(jié)構(gòu)清晰;4.可實(shí)現(xiàn)接口或抽象方法,使不同枚舉值具有差異化行為;5.注意避免濫用、硬編碼比較、依賴ordinal值,合理命名與序列化。

See all articles