您的位置:首页 > 编程语言 > Java开发

Java代理模式

2018-12-15 16:21 701 查看

         代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。简单的说就是,我们在访问实际对象时,是通过代理对象来访问的,代理模式就是在访问实际对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途。

静态代理

   由程序员创建或特定工具自动生成源代码,也就是在编译时就已经将接口,被代理类,代理类等确定下来。在程序运行之前,代理类的.class文件就已经生成。

public interface Marry {
    void prepare();//筹备婚礼
    void weeding();//婚礼
    void clear();//婚礼后收拾场地
}
public class Bridegroom implements Marry{

    @Override
    public void prepare() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void weeding() {
        System.out.println("新郎正在进行婚礼");
    }

    @Override
    public void clear() {
        // TODO Auto-generated method stub
        
    }

}
public class MarryProxy implements Marry{
    
    private Marry bridegroom;

    public MarryProxy(Marry bridegroom) {
        this.bridegroom = bridegroom;
    }
    @Override
    public void prepare() {
        System.out.println("婚前场地准备");
    }

    @Override
    public void weeding() {
        this.bridegroom.weeding();
    }

    @Override
    public void clear() {
        System.out.println("婚后收拾场地");
    }

}
public class Test {

    public static void main(String[] args) {
        Marry proxy = new MarryProxy(new Bridegroom());
        proxy.prepare();
        proxy.weeding();
        proxy.clear();
    }
}

结果:

婚前场地准备

新郎正在进行婚礼

婚后收拾场地

动态代理

 

代理类在程序运行时自动创建的代理方式被成为动态代理。

在java的java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过这个类和这个接口可以生成JDK动态代理类和动态代理对象。

 Proxy               动态生成代理类和对象

InvocationHandler   处理器接口,可以通过invoke方法实现对真实角色的代理访问,每次通过Proxy生成代理类对象时都要指定对应的处理器对象。

public interface Marry {
    void prepare();//筹备婚礼
    void weeding();//婚礼
    void clear();//婚礼后收拾场地
}
public class Bridegroom implements Marry{

    @Override
    public void prepare() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void weeding() {
        System.out.println("新郎正在进行婚礼");
    }

    @Override
    public void clear() {
        // TODO Auto-generated method stub
        
    }

}
public class MarryHandler implements InvocationHandler{
    
    private Marry bridegroom;

    public MarryHandler(Marry bridegroom) {
        super();
        this.bridegroom = bridegroom;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        method.invoke(bridegroom, args);
        return null;
    }
}
public class Test {

    public static void main(String[] args) {
        Marry bridegroom = new Bridegroom();
        MarryHandler handler = new MarryHandler(bridegroom);

        Marry proxy = (Marry) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[] { Marry.class },
                handler);
        proxy.weeding();
    }
}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 动态代理