定义:
作用就是任务的调度和分配,跟代理模式很像,可以看成是一种特殊情况下的静态代理的全权代理。
代理模式注重过程,委派模式注重结果。
不属于GOF 23种设计模式之一,属于行为模式。
Spring中Dispatch Servlet就是使用的委派模式。
package com.gupaoedu.vip.pattern.delegate.simple;
/**
* Created by Tom.
*/
public class DelegateTest {
public static void main(String[] args) {
//客户请求(Boss)、委派者(Leader)、被被委派者(Target)
//委派者要持有被委派者的引用
//代理模式注重的是过程, 委派模式注重的是结果
//策略模式注重是可扩展(外部扩展),委派模式注重内部的灵活和复用
//委派的核心:就是分发、调度、派遣
//委派模式:就是静态代理和策略模式一种特殊的组合
new Boss().command("登录",new Leader());
}
}
package com.gupaoedu.vip.pattern.delegate.simple;
/**
* Created by Tom.
*/
public class Boss {
public void command(String command,Leader leader){
leader.doing(command);
}
}
package com.gupaoedu.vip.pattern.delegate.simple;
import java.util.HashMap;
import java.util.Map;
/**
* Created by Tom.
*/
public class Leader implements IEmployee {
private Map<String,IEmployee> targets = new HashMap<String,IEmployee>();
public Leader() {
targets.put("加密",new EmployeeA());
targets.put("登录",new EmployeeB());
}
//项目经理自己不干活
public void doing(String command){
targets.get(command).doing(command);
}
}
package com.gupaoedu.vip.pattern.delegate.simple;
/**
* Created by Tom.
*/
public interface IEmployee {
public void doing(String command);
}
package com.gupaoedu.vip.pattern.delegate.simple;
/**
* Created by Tom.
*/
public class EmployeeA implements IEmployee {
@Override
public void doing(String command) {
System.out.println("我是员工A,我现在开始干" + command + "工作");
}
}
package com.gupaoedu.vip.pattern.delegate.simple;
/**
* Created by Tom.
*/
public class EmployeeB implements IEmployee {
@Override
public void doing(String command) {
System.out.println("我是员工B,我现在开始干" + command + "工作");
}
}
SpringMVC中Dispatcher Servlet使用:
package com.gupaoedu.vip.pattern.delegate.mvc;
import com.gupaoedu.vip.pattern.delegate.mvc.controllers.MemberController;
import com.gupaoedu.vip.pattern.delegate.mvc.controllers.OrderController;
import com.gupaoedu.vip.pattern.delegate.mvc.controllers.SystemController;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
/**
* 相当于是项目经理的角色
* Created by Tom.
*/
public class DispatcherServlet extends HttpServlet{
private List<Handler> handlerMapping = new ArrayList<Handler>();
public void init() throws ServletException {
try {
Class<?> memberControllerClass = MemberController.class;
handlerMapping.add(new Handler()
.setController(memberControllerClass.newInstance())
.setMethod(memberControllerClass.getMethod("getMemberById", new Class[]{String.class}))
.setUrl("/web/getMemberById.json"));
}catch(Exception e){
}
}
// private void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception{
//
// String uri = request.getRequestURI();
//
// String mid = request.getParameter("mid");
//
// if("getMemberById".equals(uri)){
// new MemberController().getMemberById(mid);
// }else if("getOrderById".equals(uri)){
// new OrderController().getOrderById(mid);
// }else if("logout".equals(uri)){
// new SystemController().logout();
// }else {
// response.getWriter().write("404 Not Found!!");
// }
//
// }
private void doDispatch(HttpServletRequest request, HttpServletResponse response){
//1、获取用户请求的url
// 如果按照J2EE的标准、每个url对对应一个Serlvet,url由浏览器输入
String uri = request.getRequestURI();
//2、Servlet拿到url以后,要做权衡(要做判断,要做选择)
// 根据用户请求的URL,去找到这个url对应的某一个java类的方法
//3、通过拿到的URL去handlerMapping(我们把它认为是策略常量)
Handler handle = null;
for (Handler h: handlerMapping) {
if(uri.equals(h.getUrl())){
handle = h;
break;
}
}
//4、将具体的任务分发给Method(通过反射去调用其对应的方法)
Object object = null;
try {
object = handle.getMethod().invoke(handle.getController(),request.getParameter("mid"));
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
//5、获取到Method执行的结果,通过Response返回出去
// response.getWriter().write();
}
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
doDispatch(req,resp);
} catch (Exception e) {
e.printStackTrace();
}
}
class Handler{
private Object controller;
private Method method;
private String url;
public Object getController() {
return controller;
}
public Handler setController(Object controller) {
this.controller = controller;
return this;
}
public Method getMethod() {
return method;
}
public Handler setMethod(Method method) {
this.method = method;
return this;
}
public String getUrl() {
return url;
}
public Handler setUrl(String url) {
this.url = url;
return this;
}
}
}
package com.gupaoedu.vip.pattern.delegate.mvc.controllers;
/**
* Created by Tom.
*/
public class MemberController {
public void getMemberById(String mid){
}
}
package com.gupaoedu.vip.pattern.delegate.mvc.controllers;
/**
* Created by Tom.
*/
public class OrderController {
public void getOrderById(String mid){
}
}
package com.gupaoedu.vip.pattern.delegate.mvc.controllers;
/**
* Created by Tom.
*/
public class SystemController {
public void logout(){
}
}
策略模式:
是指定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式可以让算法的变化不会影响到算法的用户
package com.gupaoedu.vip.pattern.strategy.promotion;
/**
* 优惠活动
* Created by Tom
*/
public class PromotionActivity {
private PromotionStrategy promotionStrategy;
public PromotionActivity(PromotionStrategy promotionStrategy) {
this.promotionStrategy = promotionStrategy;
}
public void execute(){
promotionStrategy.doPromotion();
}
}
package com.gupaoedu.vip.pattern.strategy.promotion;
import org.apache.commons.lang3.StringUtils;
/**
* 促销活动
* Created by Tom
*/
public class PromotionActivityTest {
public static void main(String[] args) {
PromotionActivity activity618 = new PromotionActivity(new CouponStrategy());
PromotionActivity activity1111 = new PromotionActivity(new CashbackStrategy());
activity618.execute();
activity1111.execute();
}
// public static void main(String[] args) {
// PromotionActivity promotionActivity = null;
//
// String promotionKey = "COUPON";
//
// if(StringUtils.equals(promotionKey,"COUPON")){
// promotionActivity = new PromotionActivity(new CouponStrategy());
// }else if(StringUtils.equals(promotionKey,"CASHBACK")){
// promotionActivity = new PromotionActivity(new CashbackStrategy());
// }//......
// promotionActivity.execute();
// }
// public static void main(String[] args) {
// String promotionKey = "GROUPBUY";
// PromotionActivity promotionActivity = new PromotionActivity(PromotionStrategyFactory.getPromotionStrategy(promotionKey));
// promotionActivity.execute();
// }
}
package com.gupaoedu.vip.pattern.strategy.promotion;
/**
* 拼团优惠
* Created by Tom
*/
public class GroupbuyStrategy implements PromotionStrategy{
public void doPromotion() {
System.out.println("拼团,满20人成团,全团享受团购价");
}
}
package com.gupaoedu.vip.pattern.strategy.promotion;
/**
* 返现活动
* Created by Tom
*/
public class CashbackStrategy implements PromotionStrategy {
public void doPromotion() {
System.out.println("返现促销,返回的金额转到支付宝账号");
}
}
package com.gupaoedu.vip.pattern.strategy.promotion;
/**
* 促销策略抽象
* Created by Tom
*/
public interface PromotionStrategy {
void doPromotion();
}
package com.gupaoedu.vip.pattern.strategy.promotion;
import java.util.HashMap;
import java.util.Map;
/**
* 促销策略工厂
* Created by Tom
*/
public class PromotionStrategyFactory {
private static Map<String,PromotionStrategy> PROMOTION_STRATEGY_MAP = new HashMap<String, PromotionStrategy>();
static {
PROMOTION_STRATEGY_MAP.put(PromotionKey.COUPON,new CouponStrategy());
PROMOTION_STRATEGY_MAP.put(PromotionKey.CASHBACK,new CashbackStrategy());
PROMOTION_STRATEGY_MAP.put(PromotionKey.GROUPBUY,new GroupbuyStrategy());
}
private static final PromotionStrategy NON_PROMOTION = new EmptyStrategy();
private PromotionStrategyFactory(){}
public static PromotionStrategy getPromotionStrategy(String promotionKey){
PromotionStrategy promotionStrategy = PROMOTION_STRATEGY_MAP.get(promotionKey);
return promotionStrategy == null ? NON_PROMOTION : promotionStrategy;
}
private interface PromotionKey{
String COUPON = "COUPON";
String CASHBACK = "CASHBACK";
String GROUPBUY = "GROUPBUY";
}
}