java静态代理记录

package com.atguigu.java3;

/**
 * 静态代理举例
 *
 * 特点:代理类和被代理类在编译期间,就确定下来了
 *
 * @author yangzhnahang
 * @create 2019-08-17-16:17
 */

//先提供一个接口
    interface ClothFactory{

        //工厂生产衣服
    void produceCloth();
}


//提供代理类
class ProxyClothFactory implements ClothFactory{

        //声明属性,属性类型是    接口
    private ClothFactory factory;

    //提供当前类的构造器 给构造器提供参数,使属性初始化
    public ProxyClothFactory(ClothFactory factory){
        this.factory = factory;
    }

    /**
     * 本段含义:调用代理类的构造器创建对象,传进来一个factory
     *  用被代理类对象进行实例化
     */


        //重写接口中的方法  快捷键输入:Alt+Enter
    @Override
    public void produceCloth() {

        System.out.println("代理工厂做一些准备工作");
        //开始用被代理类对象进行实例化    即用factory执行方法produceCloth()

        factory.produceCloth();

        System.out.println("实例化执行完成之后,代理工厂做一些后续收尾工作");

    }


}

//提供被代理类    也是一个接口形式出现
//快捷方式实现接口中的常用方法:Alt+Enter
class NikeClothFactory implements ClothFactory{

    @Override
    public void produceCloth() {
        System.out.println("Nike工厂生产一批运动服");
    }
}


//代码完成,开始测试

public class StaticProxyTest {

    public static void main(String[] args) {
        //先创建代理类ProxyClothFactory    的对象    要创建对象,需要传入参数,
        // 参数是被代理类的对象   所以要先创建一个被代理类的对象
       ClothFactory    nike = new NikeClothFactory();

        /**
         * 这行代码NikeClothFactory    nike = new NikeClothFactory();
         * 可以用ClothFactory    nike = new NikeClothFactory();来代替,
         * 即换成接口来声明类型下文,下文同理
         */





        //new ProxyClothFactory()中需要传入一个对象  这个对象是被代理类的对象
        // 通过new之后创建出一个代理类的对象proxyClothFactory
        ClothFactory proxyClothFactory = new ProxyClothFactory(nike);

        /**
         * 这行代码 ProxyClothFactory proxyClothFactory = new ProxyClothFactory(nike);
         * 可以用  ClothFactory proxyClothFactory = new ProxyClothFactory(nike);来代替
         * 即换成接口来声明类型下文,
         */


        //这是接口中声明过的方法,produceCloth()这个相当于多态
        /**
         * 这个明明写着是代理类对象proxyClothFactory,
         * 代理类编译期间认为你是接口实际上用的是代理类对象重写后的方法:
         *     //重写接口中的方法  快捷键输入:Alt+Enter
         *     @Override
         *     public void produceCloth() {
         *
         *         System.out.println("代理工厂做一些准备工作");
         *         //开始用被代理类对象进行实例化    即用factory执行方法produceCloth()
         *
         *         factory.produceCloth();
         *
         *         System.out.println("实例化执行完成之后,代理工厂做一些后续收尾工作");
         *     }
         *     重写方法运行到:factory.produceCloth();时,
         *     又调用到了ClothFactory    nike = new NikeClothFactory();
         *     中的被代理类对象:nike
         *
         *     因此可以说:代理类的对象调用的方法封装了同名方法
         */
        proxyClothFactory.produceCloth();
    }

}