设计模式之 代理模式(demo)

来源:互联网 发布:linux more 向前翻页 编辑:程序博客网 时间:2024/05/16 12:59

代理模式的原理(静态/动态)

代理实现:

    1.静态代理:              带理者只能实现一种被代理的需求    2.动态代理:              <1>可以实现针对被代理需求的多种代理              <2>需要实现 InvocationHandler接口              <3>利用反射传入的类加载器 来改变代理方法 动态传入代理加载类

一、静态代理模式

//如下实现对静态代理的测试

public class TestProxy {   `@Test    public void testStaticProxy() {        ProxyImpl im = new ProxyImpl();        Proxy2 p2=new Proxy2();        PersonProxy pp = new PersonProxy(p2);        pp.action();      }}

//代理和被代理都实现的共同接口如下:

interface Person{    void action(); }

//代理者类实现如下:

class PersonProxy implements Person{    Person p;    public PersonProxy(Person p){        this.p=p;//将 顾客(被代理人)的资料告诉代理人    }    @Override    public void action() {        System.out.println("开始代理工作");        p.action();//执行 顾客要求的代理工作        System.out.println("结束代理工作");    }}

//被代理者1——买车实现如下:

class ProxyImpl implements Person{    @Override    public void action() {        System.out.println("我要买" +"车");    }}

//被代理类2代理买房实现如下:

class Proxy2 implements Person{@Overridepublic void action() {    System.out.println("我要买房……");  }}

二、动态代理实现如下:

测试代理方法:

//测试代理运行 模块如下:

`@Testpublic void testDynamicProxy() {    Person person = new Customer1();    /**     * 参数1: 代理人对象使用的类加载器 参数2:代理人对象 实现的接口 参数3: 被代理人对象     *      * */    Person p = (Person) Proxy.newProxyInstance(person.getClass()            .getClassLoader(), person.getClass().getInterfaces(),            new Clerk(person));    p.doWork();}}

// 包含所有代理类的工厂(类似于中介可代理多种买车 买房 ……)

class Clerk implements InvocationHandler {Person person;// 被代理人public Clerk(Person person) {    this.person = person;}/** * 参数1:被代理对象 参数 2:被代理对象要代理的业务——买房或买车 参数 3:被代理对象要执行的方法的对应参数 *  * 返回:代理人对象 */@Overridepublic Object invoke(Object proxy, Method method, Object[] args)        throws Throwable {    System.out.println("-----开始代理工作------");    Object invoke = method.invoke(person, args);    System.out.println("-----结束代理工作-------");    return invoke;   }}

//共同实现的接口

interface Person {void doWork();}

//被代理对象1

class Customer1 implements Person {@Overridepublic void doWork() {    System.out.println("我要买车");  }}

//被代理对象2

class Customer implements Person {@Overridepublic void doWork() {    System.out.println("我要买房");  }}
0 0
原创粉丝点击