代理模式(委托模式)— 结构型

结构型简介

结构型模式主要总结了一些类或对象组合在一起的经典结构,这些经典的结构可以解决特定应用场景的问题。结构型模式包括:代理模式、桥接模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式。

代理模式

代理模式又分为:静态代理和动态代理

律师这个职业大家应该都了解;就是代理打官司;下面以律师代理诉讼为例介绍代理模式

静态代理

静态代理的特点就是代理和被代理都要实现或者继承同一个接口或抽象类;

诉讼接口类

public interface ILawsuit {
    //提交申请
    void submit();

    //举证
    void burden();
    
    //辩护
    void defend();
}

具体公诉人

public class ZhangSan implements ILawsuit {
    @Override
    public void submit() {
        System.out.println("老板拖欠工资,特此仲裁");
    }

    @Override
    public void burden() {
        System.out.println("劳动合同和社保证明");
    }

    @Override
    public void defend() {
        System.out.println("事实证据清楚!");
    }
}

代理律师

public class Lawyer implements ILawsuit {
    private ZhangSan zhangSan;

    public Lawyer(ZhangSan zhangSan) {
        this.zhangSan = zhangSan;
    }

    @Override
    public void submit() {
        zhangSan.submit();
    }

    @Override
    public void burden() {
        System.out.println("指导公诉人搜集证据");
        zhangSan.burden();
    }

    @Override
    public void defend() {
        System.out.println("当庭辩护等");
        zhangSan.defend();
    }
}

诉讼:

public class litigation {

    public static void main(String[] args) {
        ILawsuit zhangSan = new ZhangSan();

        ILawsuit lawyer = new Lawyer((ZhangSan) zhangSan);
        
        lawyer.submit();
        
        lawyer.burden();
        
        lawyer.defend();
        
    }
}

动态代理

Java给我提供了一个边界的动态代理接口InvocationHandler,实现该接口重写调用方法invoke。主要通过invoke方法来调用具体的被代理方法,也就是真实的方法。动态代理的实现是基于反射实现的;

实现InvocationHandler:动态代理类

public class DynamicProxy implements InvocationHandler {
    private Object obj; //被代理类的引用

    public DynamicProxy(Object obj) {
        this.obj = obj;
    }

    @Override
    public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
        //通过反射调用被代理类的对象的方法;    
        Object result = method.invoke(obj,args);
        return null;
    }
}

动态代理实现诉讼

public class Litigation {

    public static void main(String[] args) {
        ILawsuit zhangSan = new ZhangSan();
        //构造一个动态代理
        DynamicProxy proxy = new DynamicProxy(zhangSan);
        
        //获取被代理类张三的ClassLoader
        ClassLoader loader = zhangSan.getClass().getClassLoader();
        
        //动态构造一个代理律师
        ILawsuit lawyer = (ILawsuit) Proxy.newProxyInstance(loader, new Class[]{ILawsuit.class}, proxy);
        
        lawyer.submit();

        lawyer.burden();

        lawyer.defend();

    }
}

总结:静态和动态是从code方面来区分的代理模式的两种方式;

你可能感兴趣的:(设计模式)