zoukankan      html  css  js  c++  java
  • 代理模式(静态代理)

    代理模式(静态)

    定义:

    代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。一般我们写代码的时候, 对已经存在的代码尽量不要在修改了, 因为可能好多地方都调用这个方法, 改掉之后可能会出问题, 但是我们可以使用代理对象调用之前的方法进行内容扩充.

    意图:

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

    主要解决:

    在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。

    应用实例:

    1. Windows 里面的快捷方式。

    2. 猪八戒去找高翠兰结果是孙悟空变的,可以这样理解:把高翠兰的外貌抽象出来,高翠兰本人和孙悟空都实现了这个接口,猪八戒访问高翠兰的时候看不出来这个是孙悟空,所以说孙悟空是高翠兰代理类。

    3. 买火车票不一定在火车站买,也可以去代售点。

    4. 一张支票或银行存单是账户中资金的代理。支票在市场交易中用来代替现金,并提供对签发人账号上资金的控制。

    5. spring aop。

    代码案例:

    例如租房: 客户只需要租房, 不想一直找房, 看房以及后期的维护, 这时候可以找中介公司, 中介公司负责这些工作, 中介帮你找房东出租房子, 以此负责之后的维护工作等. 这里的中介起到的就是代理作用

    原理:

    创建一个接口,然后创建被代理的类实现该接口并且实现该接口中的抽象方法。之后再创建一个代理类,同时使其也实现这个接口。在代理类中持有一个被代理对象的引用,而后在代理类方法中调用该对象的方法。

    代码

    1.出租房子

    com.test.Rent

    // 出租房子
    public interface Rent {
        // 给了钱返回房子
        Object rent(Object money);
    }
    

    2.业主(要出租房屋的人

    com.test.Host

    // 业主, 出租房子
    public class Host implements Rent {
        @Override
        public Object rent(Object money) {
            System.out.println("业主(真实对象): 房屋出租成功...价钱" + money);
            return new Object(); // 假如Object就是出租的房子
        }
    }
    

    3.代理(中介公司)

    你只需要找中介租房即可, 不需要直接找业主

    com.test.Proxy

    // 代理, 中介公司
    public class Proxy implements Rent {
    
        // 提供真实对象, 被代理的对象
        private Rent host = new Host();
    
        @Override
        public Object rent(Object money) {
            // 1. 约时间
            time();
            // 2. 看房子
            seeHouse();
            // 3. 讲价钱, 签协议
            killPrice();
            // 调用业主的方法进行出租
            Object house = host.rent(money);
            // 4. 后期维护
            weihu();
            return null;
        }
        public void time() {
            System.out.println("约时间");
        }
        public void seeHouse() {
            System.out.println("看房子");
        }
        public void killPrice() {
            System.out.println("讲价钱, 签协议");
        }
        public void weihu() {
            System.out.println("后期维护");
        }
    }
    

    4.客户租房子

    com.test.Customer

    // 客户, 要租房子
    public class Customer {
        public static void main(String[] args) {
            // 找中介
            Rent agent = new Proxy();
            // 租房
            agent.rent(3000);
        }
    }
    

    结果:

    约时间
    看房子
    讲价钱, 签协议
    业主(真实对象): 房屋出租成功...价钱3000
    后期维护
    

    优点

    1. 职责清晰。
    2. 高扩展性。
    3. 智能化。

    缺点

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

    总结

    例如我们在调用service的时候, service层的一个现有存在的方法和现在的需求很相似, 但是我们不能对其更改, 因为在所有使用这个方法的地方都有可能出问题, 这时候我们就可以创建一个serviceProxy对象, 去实现之前service的接口, 在代理对象里面调用之前service的方法, 就可以不改变原有代码的情况下, 实现代码的复用

  • 相关阅读:
    Maven工程无异常 启动没有出现Starting ProtocolHandler的原因
    Unknown return value type [java.lang.Boolean]] with root cause
    解决java.lang.IllegalArgumentException: No converter found for return value of type
    jsp页面的地址
    HTTP Status 500
    Could not resolve placeholder 'IMAGE_SERVER_URL' in string value "${IMAGE_SERVER_URL}"
    yum出现Loaded plugins: fastestmirror, security Loading mirror speeds from cached hostfile解决方法
    【程序人生】百度员工应聘腾讯职位,结果亮了!
    【开源组件】FastDFS集群搭建与实战
    【开源组件】FastDFS极速入门与安装
  • 原文地址:https://www.cnblogs.com/zpKang/p/13226579.html
Copyright © 2011-2022 走看看