4.1Java设计模式-----JDK静态代理(Static Proxy)

接上文:4.Java设计模式-----代理模式(Proxy Pattern)

应用场景:

        因为房租合同到期,小明现在急需要重新寻找房源,但是苦于学业的原因,而没时间来解决找房这件事情,所以它只能将这事情交给中介公司来帮自己解决这件事情。

静态代理

       静态代理的实现比较简单,代理类通过实现与目标对象相同的接口,并在类中维护一个代理对象。通过构造器塞入目标对象,赋值给代理对象,进而执行代理对象实现的接口方法,并实现前拦截,后拦截等所需的业务功能。

 ①首先定义一个接口

/**
 * 首先定义一个Person接口,然后声明一个findHouse方法
 */
public interface Person{
    //找房子
    public void findHouse();
}

②获取被代理用户(学生)的需求

/**
 * 学生租房的一些个人需求
 */
public class Student implements Person{

    @Override
    public void findHouse(){
        System.out.println("被代理人需求:我是学生A,我现在想找一个10平米的小房间,用来学习");
    }
}

③接下来,就是代理对象(租房中介)的创建

/**
 * 代理人的创建(中介)
 */
public  class Proxy implements Person{

    //1.真正需要代理的类(学生)
    Student student;

    //2.生成一个有参构造方法,方便中介来获取用户的需求
    public Proxy(Student student){
        this.student = student;
    }    

    @Override
    public void findHouse(){
        System.out.println("(此处为前置增强)--我是中介,如下是用户的一些需求");
        System.out.println("**************************************************");
        //4.在代理类中,间接的访问被代理用户的方法
        student.findHouse();
        System.out.println("**************************************************");
        System.out.println("(此处为后置增强)--我是中介,如上就是我代理用户的需求");
    }
}

④代理类将帮助被代理人发布信息,帮其找房子(即:开始测试)

public class test{
    public static void main(String[] args){
        //1.创建一个被代理用户
        Student student = new Student();
        //2.创建一个代理用户,将用户通过构造方法传递给被代理类
        Proxy proxy = new Proxy(student);
        //3.代理用户开始帮助用户找房子
        proxy.findHouse();
    }
}
代码运行结果:
(此处为前置增强)--我是中介,如下是用户的一些需求
**************************************************
被代理人需求:我是学生A,我现在想找一个10平米的小房间,用来学习
**************************************************
(此处为后置增强)--我是中介,如上就是我代理用户的需求

静态代理实现原理:在main方法中,通过调用代理类对象的findHouse()方法,在该方法中,间接来调用被代理对象findHouse()方法,从而实现静态代理机制

静态代理的优点和缺点

       优点:可以做到不对目标对象进行修改的前提下,对目标对象进行功能的扩展和拦截,这其实是代理机制的共同优点

       缺点:①代理类,必须实现与目标对象一样的接口,会导致代理类数量太多,不易维护

                  ②如果父类接口增加方法,则目标对象和代理类都需要重新维护

附链接:4. Java设计模式-----代理模式(Proxy Pattern)

              4.2 Java设计模式-----JDK动态代理(Dynamic Proxy)

              4.3 Java设计模式-----Cglib动态代理(Cglib Proxy)

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