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

设计模式主要有23种,大致可分为三类:创建型,机构行,行为型;具体如下:

创建型

1,单例设计模式
2,工厂设计模式
3,建造者设计模式
4,原型设计模式

结构型

5,代理设计模式
6,桥接设计模式
7,装饰设计模式
8,适配器设计模式
9,外观设计模式
10,享元设计模式
11,组合设计模式

行为型

12,模板设计模式

13,观察者模式

14,策略设计模式

持续更新中...

 

结构型简介

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


代理模式

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

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

静态代理

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

诉讼接口类

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方面来区分的代理模式的两种方式;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ang_qq_252390816

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值