设计模式の委派模式&策略模式
委派模式
该模式非23种设计模式之中的一种,他的基本作用就是负责任务的调用和分配,下面我们就用工作种的场景用代码的方式来提现委派模式
老板给项目经理下达任务,项目经理给每个员工派发任务,等到员工完成工作后,项目经理再给老板汇报,
员工接口
public interface Employee {
void doing(String something);
}
员工A
public class EmployeeA implements Employee{
@Override
public void doing(String something) {
System.out.println("员工A正在做" + something);
}
}
员工B
public class EmployeeB implements Employee{
@Override
public void doing(String something) {
System.out.println("员工B正在做" + something);
}
}
上级领导
public class Leader implements Employee{
private Map<String,Employee> targets = new HashMap<String,Employee>();
public Leader() {
targets.put("workA",new EmployeeA());
targets.put("workB",new EmployeeB());
//...
}
@Override
public void doing(String something) {
//领导根据工作划分给不同的员工,比如workA为开发 , workB为测试
targets.get(something).doing(something);
}
}
老板
public class Boss {
/**
* boss这里开始派活,他可以派活给任何人,可能有多个Leader和多个员工,但他们都实现了Employee 接口
*/
public void command(String command,Leader leader){
leader.doing(command);
}
}
测试类
public class TestMain {
public static void main(String[] args) {
//派活给Leader
new Boss().command("workA" , new Leader());
new Boss().command("workB" , new Leader());
}
}
策略模式
这里我们使用策略模式实现选择支付方式的业务场景,大家在我网上买东西的时候,现在打击垄断,各个电商平台都支持多种支付方式,比如我在某东上购买商品,此时可以选择微信支付、支付宝支付、白条支付、银联支付等
支付结果状态实体
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PayState {
private int code;
private String result;
private String msg;
}
支付渠道顶层类
public abstract class Payment {
//支付类型
public abstract String getName();
//查询余额
public abstract double queryBalance(String uid);
public PayState pay(String uid,double amount) {
if(queryBalance(uid) < amount){
return new PayState(500,"支付失败","余额不足");
}
return new PayState(200,"支付成功","支付金额:" + amount);
}
}
支付宝支付实现
public class AliPay extends Payment{
@Override
public String getName() {
return "支付宝";
}
@Override
public double queryBalance(String uid) {
return 1000;
}
}
京东支付实现
public class JdPay extends Payment{
@Override
public String getName() {
return "京东白条";
}
@Override
public double queryBalance(String uid) {
return 2000;
}
}
银联支付实现
public class UnionPay extends Payment{
@Override
public String getName() {
return "银联支付";
}
@Override
public double queryBalance(String uid) {
return 10000;
}
}
微信支付实现
public class WeChatPay extends Payment{
@Override
public String getName() {
return "微信支付";
}
@Override
public double queryBalance(String uid) {
return 500;
}
}
支付策略管理类
public class PayStrategy {
public static final String ALI_PAY = "AliPay";
public static final String JD_PAY = "JdPay";
public static final String UNION_PAY = "UnionPay";
public static final String WECHAT_PAY = "WechatPay";
public static final String DEFAULT_PAY = ALI_PAY;
private static Map<String,Payment> payStrategy = new HashMap<String,Payment>();
static {
payStrategy.put(ALI_PAY,new AliPay());
payStrategy.put(WECHAT_PAY,new WeChatPay());
payStrategy.put(UNION_PAY,new UnionPay());
payStrategy.put(JD_PAY,new JdPay());
payStrategy.put(DEFAULT_PAY,new JdPay());
}
public static Payment get(String payKey){
if(!payStrategy.containsKey(payKey)){
return payStrategy.get(DEFAULT_PAY);
}
return payStrategy.get(payKey);
}
}
订单类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Order {
private String uid;
private String orderId;
private double amount;
//在这就完美的适配了所有支付方式,不用在写switvh 或者if else
public PayState pay(){
return pay(PayStrategy.DEFAULT_PAY);
}
public PayState pay(String payKey){
Payment payment = PayStrategy.get(payKey);
System.out.println("欢迎使用" + payment.getName());
System.out.println("本次交易金额为:" + amount + ",开始扣款...");
return payment.pay(uid,amount);
}
}
测试类
public class TestMain {
public static void main(String[] args) {
//创建订单完成
Order order = new Order("12580", "20220308153222", 1200);
//开始支付 ,选择支付方式,默认使用京东白条进行支付
//order.pay();
//关于取何种支付方式,由前端传约定值给后台即可
PayState payState = order.pay(PayStrategy.UNION_PAY);
System.out.println(payState);
}
}
//控制台
欢迎使用银联支付
本次交易金额为:1200.0,开始扣款...
PayState(code=200, result=支付成功, msg=支付金额:1200.0)

浙公网安备 33010602011771号