设计模式-代理模式(Proxy)

代理模式是构造型模式的一种,它可以为其他对象提供一种代理以控制对这个对象的访问。

所为代理,是具有与代理元(被代理的对象)(RealSubject)具有相同的接口(Subject)的类。

角色和职责:

1.抽象主题(subject)-Subject:

  抽象主题公共接口

2.具体主题(RealSubject)-RealSubject:

    代理角色所代表的真实对象

3.代理主题(Proxy)-StaticProxySubject、DynamicProxySubject:

    含有对真实主题角色的引用,代理角色通常在将客户端调用传递给真实主题之前或者之后执行某些操作,而不是单纯返回真实的对象

 

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

UML图:

具体代码:

/**
 * 卖书
 */
public interface Subject {
    void doAction();//卖书
}
/**
 * 出版社卖书
 */
public class RealSubject implements Subject{
    @Override
    public void doAction() {
        System.out.println("卖书");
    }
}
/**
 * 静态代理:当当网卖书
 */
public class StaticProxySubject implements Subject{
    private RealSubject realSubject;

    public StaticProxySubject(){
        this.realSubject = new RealSubject();//出版社
    }

    @Override
    public void doAction() {
        this.discount();//打折
        this.realSubject.doAction();//卖书
        this.give();//送礼品
    }

    /**
     * 打折
     */
    private void discount(){
        System.out.println("打折");
    }

    /**
     * 送礼品
     */
    private void give(){
        System.out.println("送礼品");
    }
}
/**
 * 动态代理
 */
public class DynamicProxySubject implements InvocationHandler {
    private RealSubject realSubject;

    public DynamicProxySubject(){
        this.realSubject = new RealSubject();
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        this.discount();//打折
        Object obj = method.invoke(realSubject,args);
        this.give();//送礼品
        return obj;
    }

    /**
     * 打折
     */
    private void discount(){
        System.out.println("打折");
    }

    /**
     * 送礼品
     */
    private void give(){
        System.out.println("送礼品");
    }
}
import java.lang.reflect.Proxy;

public class Main {
    public static void main(String[] args) {
        //静态代理
        StaticProxySubject staticProxySubject = new StaticProxySubject();
        staticProxySubject.doAction();//卖书
        System.out.println("----------------------------");

        //动态代理
        DynamicProxySubject dynamicProxySubject = new DynamicProxySubject();
        Subject subject = (Subject) Proxy.newProxyInstance(Subject.class.getClassLoader(), new Class[]{Subject.class},dynamicProxySubject);
        subject.doAction();//卖书
    }
}

 

 

 项目源码:https://github.com/qjm201000/design_pattern_proxy.git

 

posted @ 2018-12-04 19:41  qjm201000  阅读(147)  评论(0编辑  收藏  举报