代理模式

来源:互联网 发布:道路照明计算软件 编辑:程序博客网 时间:2024/06/03 17:22

1类图

这里写图片描述

2定义

为其他对象提供一种代理以控制对这个对象的访问。

3应用场景

1. 当无法或不想直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,委托对象与代理对象需要实现相同的接口。

通用模板

4抽象主题类

public abstract class Subject {    public abstract void visit();}

5具体主题类

public class RealSubject extends Subject {    @Override    public void visit() {        System.out.println("Real subject");    }}

6代理类

public class ProxySubject extends Subject {    private RealSubject mSubject;    public ProxySubject(RealSubject realSubject) {        mSubject = realSubject;    }    @Override    public void visit() {        mSubject.visit();    }}

7客户类

public class Client {    public static void main(String[] args) {        RealSubject real = new RealSubject();        ProxySubject proxySubject = new ProxySubject(real);        proxySubject.visit();    }}

简单实现

8诉讼接口

public interface ILawsuit {    void submit();    void burden();    void defend();    void finish();}

9具体诉讼人

public class Xiaomin implements ILawsuit{    @Override    public void submit() {        System.out.println("拖欠工资!");    }    @Override    public void burden() {        System.out.println("证据 ");    }    @Override    public void defend() {        System.out.println("证据确凿!");    }    @Override    public void finish() {        System.out.println("结束");    }}

10代理律师

public class Lawyer implements ILawsuit{    private ILawsuit mLawsuit;    public Lawyer(ILawsuit mLawsuit) {        this.mLawsuit = mLawsuit;    }    @Override    public void submit() {        mLawsuit.submit();    }    @Override    public void burden() {        mLawsuit.burden();    }    @Override    public void defend() {        mLawsuit.defend();    }    @Override    public void finish() {        mLawsuit.finish();    }}

11客户类

public class Client {    public static void main(String[] args) {        ILawsuit xiaomin = new Xiaomin();        ILawsuit lawyer = new Lawyer(xiaomin);        lawyer.submit();        lawyer.burden();        lawyer.defend();        lawyer.finish();    }}

动态代理

12动态代理类

public class DynamicProxy implements InvocationHandler {    private Object obj;    public DynamicProxy(Object obj) {        this.obj = obj;    }    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        Object result = method.invoke(obj, args);        return result;    }}

13动态代理客户类

public class Client {    public static void main(String[] args) {        //method1();        ILawsuit xiaomin = new Xiaomin();        DynamicProxy proxy = new DynamicProxy(xiaomin);        ClassLoader loader = xiaomin.getClass().getClassLoader();        ILawsuit lawyer = (ILawsuit)Proxy.newProxyInstance(loader,new Class[]{ILawsuit.class},                 proxy);        lawyer.submit();        lawyer.burden();        lawyer.defend();        lawyer.finish();    }}
原创粉丝点击