• 【技术累积】【点】【java】【30】代理模式


    基础

    代理模式是Java常见的设计模式之一。所谓代理模式是指客户端并不直接调用实际的对象,而是通过调用代理,来间接的调用实际的对象。

    什么是代理

    参考现实生活中的代理

    比如某个品牌的某个省的代理商,作为客户我们只会跟省代理这边买东西,而不会直接跟厂商接触。这里的代理,是商家代理了品牌。

    所谓正向代理和反向代理,就要理解正向和反向。

    这里的方向,个人理解是调用发生的方向。

    正向代理:

    • 是服务器代理用户;
    • 多个用户使用代理服务器,代理服务器调用唯一服务端服务器;
    • 隐藏了真实的请求客户端;

    反向代理:

    • 是服务器代理服务端服务器;

    • 一个用户调用代理服务器,代理服务器调用多个服务端服务器;

    • 隐藏了真实的服务端;

    • 反向代理为何叫反向代理?

    程序中的代理模式

    通过聚合/注入的模式,拆分调用,分为静态代理和动态代理。

    • 代理类和实际类都实现了抽象的Subject接口,保证了对客户端的使用透明;
    • 在代理类中统一调用实现的方法,调用者为注入的某个实际类,具体为客户端选择;
    • 在实际类中定义个性化实现;

    静态代理

    代码体现

    public interface Subject {
        void visit();
    }
    
    public class RealSubject implements Subject {
    
        private String name = "byhieg";
        @Override
        public void visit() {
            System.out.println(name);
        }
    }
    
    public class ProxySubject implements Subject{
    
        private Subject subject;
    
        public ProxySubject(Subject subject) {
            this.subject = subject;
        }
    
        @Override
        public void visit() {
            subject.visit();
        }
    }
    
    public class Client {
    
        public static void main(String[] args) {
            ProxySubject subject = new ProxySubject(new RealSubject());
            subject.visit();
        }
    }
    

    动态代理

    动态代理和静态代理的不同,主要体现在

    • 客户端调用
    • 代理类的实现

    其中代理类的实现是关键,即从直接写死到动态生成;

    动态生成,一方面需要写动态代理的声明,然后实例化

    public class DynamicProxy implements InvocationHandler {
        private Object object;
        public DynamicProxy(Object object) {
            this.object = object;
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            Object result = method.invoke(object, args);
            return result;
        }
    }
    
    Subject realSubject = new RealSubject();
    DynamicProxy proxy = new DynamicProxy(realSubject);
    ClassLoader classLoader = realSubject.getClass().getClassLoader();
    Subject subject = (Subject) Proxy.newProxyInstance(classLoader, new  Class[]{Subject.class}, proxy);
    subject.visit();
    

    参考文章

  • 相关阅读:
    303. Range Sum Query
    302. Smallest Rectangle Enclosing Black Pixels
    301. Remove Invalid Parentheses
    The Swift.org Blog Welcome
    About Swift
    Swift is Open Source
    Swift is Now Open Source
    加快Terminal的打开加载速度
    加快Terminal的打开加载速度
    [note]What I’ve learnt from working on startups
  • 原文地址:https://www.cnblogs.com/andy1202go/p/9884283.html
Copyright © 2020-2023  润新知