設計模式按照功能型分類
創建型模式:
- 工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式
結構型模式:
- 配接器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式
行為型模式:
-
策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式
策略模式的定義:
-
定義了演算法族,分別封裝起來,讓它們直接可以互相替換,此模式讓演算法的變化獨立于使用演算法的客戶.讓演算法的變化不會影響演算法的用戶.
-
適用場景: 對外提供一個統一的介面,有不同的業務實作,上層不需要關心具體的實作細節,比如支付場景,訊息消費場景
-
可以避免多重分支 if else 或者switch分支
-
屬于行為型模式
適用場景舉例:
- 訂單支付場景
/**
* 支付訂單
*/
@Data
@Accessors(chain = true)
public class PayOrder {
/**
* 訂單號
*/
private String orderId;
/**
* 支付用戶
*/
private String userId;
/**
* 支付金額
*/
private Long payAmount;
/**
* 支付渠道
*/
private PayChannelEnums payChannel;
public PayOrder(String orderId, String userId, Long payAmount, PayChannelEnums payChannel) {
this.orderId = orderId;
this.userId = userId;
this.payAmount = payAmount;
this.payChannel = payChannel;
}
/**
* 支付型別列舉
*/
public enum PayChannelEnums {
/**
* 支付渠道
*/
WE_CHAT("wechat", "微信支付"),
ALI_PAY("alipay", "支付寶支付"),
JD_PAY("jdpay", "京東白條"),
UNION_PAY("unionpay", "銀聯支付");
private String code;
private String desc;
PayChannelEnums(String code, String desc) {
this.code = code;
this.desc = desc;
}
public String getCode() {
return code;
}
public String getDesc() {
return desc;
}
}
/**
* 支付介面
*/
public interface Payment {
/**
* 標準支付方法
*/
Boolean doPay(PayOrder payOrder);
/**
* 校驗余額,鉤子方法
*/
Boolean checkalance(PayOrder payOrder);
}
/**
* 支付寶支付
*/
public class AliPay implements Payment {
static {
System.out.println("歡迎使用阿里支付");
}
@Override
public Boolean doPay(PayOrder payOrder) {
return true;
}
@Override
public Boolean checkBalance(PayOrder payOrder) {
return payOrder.getPayAmount() > 10;
}
}
/**
* 微信支付
*/
public class WeChatPay implements Payment {
static {
System.out.println("歡迎使用微信支付");
}
@Override
public Boolean doPay(PayOrder payOrder) {
return true;
}
@Override
public Boolean checkBalance(PayOrder payOrder) {
return payOrder.getPayAmount() > 50;
}
}
/**
* 默認執行的實作類
*/
public class DefaultPayment implements Payment {
@Override
public Boolean doPay(PayOrder payOrder) {
Payment payment = getPaymentByType(payOrder.getPayChannel());
if (payment == null) {
System.out.println("不支持的支付型別");
return false;
}
//校驗余額
Boolean checkalance = payment.checkBalance(payOrder);
if (!checkalance) {
System.out.println("您的余額不足,無法支付");
return false;
}
Boolean result = payment.doPay(payOrder);
if (!result) {
System.out.println("支付失敗");
} else {
System.out.println("支付成功");
}
return result;
}
/**
* 獲取實際的支付型別,也可以通過spring背景關系獲取,或者通過bean工廠創建
*
* @param payChannelEnums
* @return
*/
private Payment getPaymentByType(PayChannelEnums payChannelEnums) {
try {
if (Objects.equals(payChannelEnums, PayChannelEnums.WE_CHAT)) {
return new WeChatPay();
}
if (Objects.equals(payChannelEnums, PayChannelEnums.ALI_PAY)) {
return new AliPay();
}
if (Objects.equals(payChannelEnums, PayChannelEnums.JD_PAY)) {
return new JdPay();
}
if (Objects.equals(payChannelEnums, PayChannelEnums.UNION_PAY)) {
return new UnionPay();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
public Boolean checkBalance(PayOrder payOrder) {
return false;
}
}
/**
* 支付控制臺
*/
public interface PaymentPlatform {
/**
* 訂單支付入口
*
* @param payOrder
* @return
*/
Boolean orderPay(PayOrder payOrder);
}
/**
* 支付控制臺實作類
*/
public class PaymentPlatformImpl implements PaymentPlatform {
@Override
public Boolean orderPay(PayOrder payOrder) {
//默認執行的實作類實作,不需要關心支付細節
Payment defaultPayment = new DefaultPayment();
return defaultPayment.doPay(payOrder);
}
}
/**
* 執行main方法
*/
public class MainClass {
public static void main(String[] args) {
PayOrder payOrder = new PayOrder("O-0001", "lihua", 20L, PayChannelEnums.ALI_PAY);
PaymentPlatform paymentPlatform = new PaymentPlatformImpl();
paymentPlatform.orderPay(payOrder);
}
}
/**
* 控制臺輸出
*/
------------------
歡迎使用阿里支付
支付成功
-------------------
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/272157.html
標籤:其他
上一篇:設計模式-策略模式初體驗
下一篇:【Spring MVC】 (第一篇)概述 + 專案實體(配置版)+ 具體步驟 + 流程原理的分析,附:/ 與 /* 的區別
