• 移动架构-代理模式


    代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介

    优缺点

    优点

    • 职责清晰
    • 高扩展性
    • 智能化

    缺点

    • 由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢
    • 实现代理模式需要额外的工作,有些代理模式的实现非常复杂

    角色

    • Subject:抽象主题角色,是一个接口。该接口是对象和它的代理共用的接口
    • RealSubject:真实主题角色,是实现抽象主题接口的类
    • Proxy:代理角色,内部含有对真实对象RealSubject的引用,从而可以操作真实对象。代理对象提供与真实对象相同的接口,以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装

    实现动态代理的关键技术是反射

    静态代理

    首先是一个抽象主题角色

    public interface Subject {
    	void request();
    }
    

    然后是具体主题角色

    public class RealSubject implements Subject{
    	@Override
    	public void request() {
    		System.out.println("真正的角色");
    	}
    }
    

    最后是代理角色

    public class StaticProxy implements Subject{
    	private Subject subject;
    	public StaticProxy(Subject subject) {
    		this.subject = subject;
    	}
    	@Override
    	public void request() {
    		System.out.println("before");
    		subject.request();
    		System.out.println("after");
    	}
    }
    

    测试

    public class Test {
    	//静态代理
    	public static void main(String[] args) {
    		Subject subject = new RealSubject();
    		StaticProxy proxy = new StaticProxy(subject);
    		proxy.request();
    	}
    }
    

    动态代理

    在动态代理模式中,抽象代理者和具体代理者是相同的,不同的是代理角色

    public class DynamicProxy implements InvocationHandler{
    	private Object target;
    	public DynamicProxy(Object target) {
    		this.target = target;
    	}
    	@Override
    	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    		System.out.println("before");
    		Object result = method.invoke(target, args);
    		System.out.println("after");
    		return result;
    	}
    }
    

    测试

    public class Test {
    	//动态代理
    	public static void main(String[] args) {
    		Subject subject = new RealSubject();
    		DynamicProxy handler = new DynamicProxy(subject);
    		Subject proxy = (Subject) Proxy.newProxyInstance(
    				Thread.currentThread().getContextClassLoader(),
    				subject.getClass().getInterfaces(), handler);
    		proxy.request();
    	}
    }
    
  • 相关阅读:
    video和audio
    表单
    二叉树的先序遍历,后序遍历究竟是如何与快速排序,归并排序扯上关系?
    Python3下约瑟夫环的不同实现方式
    Golang下基于uint32的BitMap类库
    annotation
    流媒体技术
    C++系列之new 和 delete 的使用
    简易科学计算器的设计
    学生成绩档案管理系统的设计
  • 原文地址:https://www.cnblogs.com/cj5785/p/10664615.html
Copyright © 2020-2023  润新知