Skip to content

Latest commit

 

History

History
333 lines (274 loc) · 7.57 KB

File metadata and controls

333 lines (274 loc) · 7.57 KB

委派模式

1.委派模式的基本作用就是负责任务的调度和分配任务,跟代理模式很想,可以看作是一种特殊情况下的静态代理的全权代理,但是代理模式很注重过程,而委派模式注重结果。

2.不属于GOF 23种设计模式之一。

3.属于行为型模式

老板员工案例

public interface IEmployee {
    public void doing(String command);
}
public class EmployeeA implements IEmployee{
    @Override
    public void doing(String command) {
        System.out.println("我是员工A,擅长加密");
    }
}
public class EmployeeB implements IEmployee{
    @Override
    public void doing(String command) {
        System.out.println("我擅长做架构");
    }
}
public class Leader {
    // 预先知道每个员工的特长,特征,分发任务
    private Map<String, IEmployee> register = new HashMap<>();


    public Leader() {
        register.put("加密", new EmployeeA());
        register.put("架构", new EmployeeB());
    }

    public void doing(String command) {
        register.get(command).doing(command);
    }
}
public class Boss {
    public void command(String command, Leader leader) {
        leader.doing(command);
    }
}
public class DelegateTest {
    public static void main(String[] args) {
        new Boss().command("加密", new Leader());
    }
}

Spring Dispatch案例

public class MemberController {

    public void getMemberById(String mid) {

    }

    public void getOrderById(String mid) {
    }
}
public class DispatchServlet extends HttpServlet {
    private static final long serialVersionUID = -334269929375066671L;

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 完成调度
        doDispatch(req, resp);
        super.service(req, resp);
    }

    private void doDispatch(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        String uri = req.getRequestURI();
        String mid = req.getParameter("mid");
        if ("getMemberById".equals(uri)) {
            new MemberController().getMemberById(mid);
        } else if ("getOrderById".equals(uri)) {
            new MemberController().getOrderById(mid);
        } else {
            resp.getWriter().write("404");
        }
    }
}

策略模式

支付案例

public abstract class Payment {
    public abstract String getName();

    protected abstract double queryBalance(String uid);

    public MsgResult pay(String uid, double amount) {
        if (queryBalance(uid) < amount) {
            return new MsgResult(500, "余额不足", "支付失败");
        }
        return new MsgResult(200, amount, "支付成功");
    }
}
public class Alipay extends Payment{
    @Override
    public String getName() {
        return "支付宝";
    }

    @Override
    protected double queryBalance(String uid) {
        return 900;
    }
}
public class JDPay extends Payment{
    @Override
    public String getName() {
        return "京东";
    }

    @Override
    protected double queryBalance(String uid) {
        return 500;
    }
}
public class UnionPay extends Payment{
    @Override
    public String getName() {
        return "银联支付";
    }

    @Override
    protected double queryBalance(String uid) {
        return 230;
    }
}
public class WechatPay extends Payment{
    @Override
    public String getName() {
        return "微信支付";
    }

    @Override
    protected double queryBalance(String uid) {
        return 250;
    }
}
public class PayStrategy {
    public static final String ALI_PAY = "Alipay";
    public static final String JD_PAY = "JdPay";
    public static final String WECHAT_PAY = "WechatPay";
    public static final String UNION_PAY = "UnionPay";
    public static final String DEFAULT_PAY = ALI_PAY;

    public static Map<String, Payment> payStrategy = new HashMap<>();

    static {
        payStrategy.put(ALI_PAY, new Alipay());
        payStrategy.put(JD_PAY, new JDPay());
        payStrategy.put(WECHAT_PAY, new WechatPay());
        payStrategy.put(UNION_PAY, new UnionPay());

    }

    public static Payment get(String payKey) {
        if (!payStrategy.containsKey(payKey)) {
            return payStrategy.get(DEFAULT_PAY);
        }
        return payStrategy.get(payKey);
    }
}
public class Order {
    private String uid;
    private String orderId;
    private double amount;

    public Order(String uid, String orderId, double amount) {
        this.uid = uid;
        this.orderId = orderId;
        this.amount = amount;
    }

    public MsgResult pay(String payKey) {
        Payment payment = PayStrategy.get(payKey);
        System.out.println("欢迎使用" + payment.getName());
        return payment.pay(uid, amount);
    }
}

活动促销策略

public interface PromotionStrategy {
    void doPromotion();
}
public class CashbackStrategy implements PromotionStrategy{
    @Override
    public void doPromotion() {
        System.out.println("返现促销,返回的金额转到支付宝账号");
    }
}
public class CouponStrategy implements PromotionStrategy {
    @Override
    public void doPromotion() {
        System.out.println("领取优惠券,课程的价格直接减去优惠券面值抵扣");
    }
}
public class EmptyStrategy implements PromotionStrategy{
    @Override
    public void doPromotion() {
        System.out.println("无促销活动");
    }
}
public class GroupbuyStrategy implements PromotionStrategy{
    @Override
    public void doPromotion() {
        System.out.println("拼团,满20人拼团,全团享受价格");
    }
}
public class PromotionStrategyFactory {
    private static final Map<String, PromotionStrategy> PROMOTION_Map = new HashMap<>();

    static {
        PROMOTION_Map.put(PromotionKey.COUPON, new CouponStrategy());
        PROMOTION_Map.put(PromotionKey.CASHBACK, new CashbackStrategy());
        PROMOTION_Map.put(PromotionKey.GROUPBUY, new GroupbuyStrategy());
    }

    private PromotionStrategyFactory() {
    }

    private interface PromotionKey {
        String COUPON = "COUPON";
        String CASHBACK = "CASHBACK";
        String GROUPBUY = "GROUPBUY";
    }

    private static final PromotionStrategy NON_PROMOTION_STRATEGY = new EmptyStrategy();

    public static PromotionStrategy getPromotionStrategy(String promotionKey) {
        PromotionStrategy promotionStrategy = PROMOTION_Map.get(promotionKey);
        return promotionStrategy == null ? NON_PROMOTION_STRATEGY : promotionStrategy;
    }
}
public class PromotionActivity {

    PromotionStrategy promotionStrategy;
    public PromotionActivity(PromotionStrategy promotionStrategy) {
        this.promotionStrategy = promotionStrategy;
    }

    public void execute() {
        this.promotionStrategy.doPromotion();
    }
}
public class PromotionActivityTest {

    public static void main(String[] args) {
//        PromotionActivity promotionActivity = new PromotionActivity(new CouponStrategy());
//
//        PromotionActivity promotionActivity1 = new PromotionActivity(new CashbackStrategy());
//
//        promotionActivity.execute();
//
//        promotionActivity1.execute();
        String promotionKey = "GROUPBUY";
        PromotionActivity promotionActivity = new PromotionActivity(PromotionStrategyFactory.getPromotionStrategy(promotionKey));
        promotionActivity.execute();

    }
}