java基础-委派模式

概述

委派模式(Delegate Pattern)又叫委托模式。它的基本作用就是负责任务的调度和任务分配,将任务的分配和执行分离开来。可以看做是一种特殊情况下的静态代理的全权代理。
不属于GOF 23种设计模式之一。
属于行为型模式。


场景

1、委派对象本身不知道如何处理一个任务(或一个请求),把请求交给其它对象来处理。
2、实现程序的解耦。
 


优点

通过任务委派能够将一个大型的任务细化,然后通过统一管理这些子"任务的完成情况实现任务的跟进,能够加快任务执行的效率。
 


缺点

任务委派方式需要根据任务的复杂程度进行不同的改变,在任务比较复杂的情况下可能需要进行多重委派,容易造成紊乱。
 


栗子1#任务分发

public interface Task {
    void doTask();
}
public class ConcreteA implements Task {
    public void doTask() {
        System.out.println("执行 , 由A实现");
    }
}
public class ConcreteB implements Task {
    public void doTask() {
        System.out.println("执行 , 由B实现");
    }
}
public class Delegate implements Task{
    public void doTask() {
        System.out.println("代理执行开始....");

        Task task = null;
        if (new Random().nextBoolean()){
        task = new ConcreteA();
        task.doTask();
        }else{
            task = new ConcreteB();
            task.doTask();
        }

        System.out.println("代理执行完毕....");
    }
}
public class Test {
    public static void main(String[] args) {
        new Delegate().doTask();
    }
}

图:

栗子2 老板让leader去吩咐员工做事

public interface IEmployee {
    void doing(String task);
}

public class EmployeeA implements IEmployee {
    protected String goodAt = "编程";
    public void doing(String task) {
        System.out.println("我是员工A,我擅长" + goodAt + ",现在开始做" +task + "工作");
    }
}

public class EmployeeB implements IEmployee {
    protected String goodAt = "平面设计";
    public void doing(String task) {
        System.out.println("我是员工B,我擅长" + goodAt + ",现在开始做" +task + "工作");
    }
}

//俺是经理,俺去分发任务给小弟做,我就是委派的人
public class Leader implements IEmployee {

    private Map<String,IEmployee> employee = new HashMap<String,IEmployee>();

    public Leader(){
        employee.put("爬虫",new EmployeeA());
        employee.put("海报图",new EmployeeB());
    }

    public void doing(String task) {
        if(!employee.containsKey(task)){
            System.out.println("这个任务" +task + "超出我的能力范围");
            return;
        }
        employee.get(task).doing(task);
    }
}

public class Boss {
    public void command(String task,Leader leader){
        leader.doing(task);
    }
}

图1-2:


源码中的使用案例#ClassLoader

public abstract class ClassLoader {

    private static native void registerNatives();
    static {
        registerNatives();
    }

    private final ClassLoader parent;

}

 protected Class<?> loadClass(String name, boolean resolve)
        throws ClassNotFoundException
    {
        synchronized (getClassLoadingLock(name)) {
             
            Class<?> c = findLoadedClass(name);
            if (c == null) {
                long t0 = System.nanoTime();
                try {
                   // 先看父亲有没有,也叫双亲委派模式
                    if (parent != null) {
                        c = parent.loadClass(name, false);
                    } else {
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {
                    // ClassNotFoundException thrown if class not found
                    // from the non-null parent class loader
                }

源码中的使用案例#Method

   
    private volatile MethodAccessor methodAccessor;
 public Object invoke(Object obj, Object... args)
        throws IllegalAccessException, IllegalArgumentException,
           InvocationTargetException
    {
        if (!override) {
            if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
                Class<?> caller = Reflection.getCallerClass();
                checkAccess(caller, clazz, obj, modifiers);
            }
        }
        // 调用的是这个 
        MethodAccessor ma = methodAccessor;             // read volatile
        if (ma == null) {
            ma = acquireMethodAccessor();
        }
        return ma.invoke(obj, args);
    }
// 可以知道调用的是MethodAccessor,Method啥是都没做,

源码中的使用案例#Spring解析XML

	@Nullable
	private BeanDefinitionParserDelegate delegate;

// 根据xml类型来生成不同的委派
protected BeanDefinitionParserDelegate createDelegate(
			XmlReaderContext readerContext, Element root, @Nullable BeanDefinitionParserDelegate parentDelegate) {

		BeanDefinitionParserDelegate delegate = new BeanDefinitionParserDelegate(readerContext);
		delegate.initDefaults(root, parentDelegate);
		return delegate;
	}

源码中的使用案例#Dsipatcher#doDispatch

扫描所有的controller,然后加载到一个map,然后分化执行

  protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {

            try {
                ModelAndView mv = null;
                Object dispatchException = null;

           try {
                    processedRequest = this.checkMultipart(request);
                    multipartRequestParsed = processedRequest != request;
                    // 获取映射handler url以及对应当执行参数
                    mappedHandler = this.getHandler(processedRequest);
                    if (mappedHandler == null) {
                        this.noHandlerFound(processedRequest, response);
                        return;
             }

 
     mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
}

委派和代理的区别

1、委派模式是行为型模式,代理模式是结构型模式
2、委派模式注重的是任务派遣,注重结果;
      代理模式注重的是代码增强,注重过程。
3、委派模式是一种特殊的静态代理,相当于全权代理。


1

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值