代理模式

来源:互联网 发布:男包品牌 知乎 编辑:程序博客网 时间:2024/06/05 15:10

代理模式(结构型模式)

所谓代理,是指具有与代理元(被代理对象)具有相同的接口的类,客户端必须通过代理与被代理的目标类交互,而代理一般在交互的过程中进行某些特别的处理

这里以买书为例,我们一般直接去书店或去网上商店上买书,而不直接去出版社买。这里书店就是出版社的代理,出版社就是一个被代理的对象。

subject.java
代理类与被代理类的共同接口

public interface Subject {    void sailBook();}

Press.java
出版社,被代理对象

public class Press implements Subject {    @Override    public void sailBook() {        System.out.println("卖书");    }}

BookStore.java
书店,代理对象

public class BookStore implements Subject {    private Press press;    @Override    public void sailBook() {        if (press == null) {            press = new Press();        }        discount();        press.sailBook();        integral();    }    public void discount() {        System.out.println("打折");    }    public void integral() {        System.out.println("积分");    }}

Test.java
测试类

public class Test {    public static void main(String[] args) {        BookStore proxy = new BookStore();        proxy.sailBook();    }}

结果

打折卖书积分

代理模式(动态代理)

不需要自己写代理类,由jdk帮你生成。Struts2的拦截器和spring AOP都是用到了动态代理

Subject.java

代理类和被代理类的接口

public interface Subject {    void sailBook();}

Press.java

被代理类

public class Press implements Subject {    @Override    public void sailBook() {        System.out.println("卖书");    }}

MyHandler.java
实现了InvocationHandler接口,实现了其invoke()方法

public class MyHandler implements InvocationHandler {    private Press press;    public void setPress(Press press) {        this.press = press;    }    @Override    public Object invoke(Object proxy, Method method, Object[] args) {        Object result = null;        discount();        try {            result = method.invoke(press, args);        } catch (IllegalAccessException | IllegalArgumentException                | InvocationTargetException e) {            e.printStackTrace();        }        integral();        return result;    }    public void discount() {        System.out.println("打折");    }    public void integral() {        System.out.println("积分");    }}

Test.java测试类

public class Test {    public static void main(String[] args) {        Press press = new Press();        MyHandler handler = new MyHandler();        handler.setPress(press);        Subject subject = (Subject) Proxy.newProxyInstance(Press.class.getClassLoader(), Press.class.getInterfaces(), handler);        subject.sailBook();    }}

结果

打折卖书积分