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

    静态代理模式,为其他对象提供一种代理来控制对这个对象的访问。

    代理,顾名思义,就好比如明星的经纪人可以代理他处理一些业务上的事情,再比如你领取快递,几乎都是通过一些代理点领取,应该没人到总部领取吧。

    UML:

    共用的接口(Subject):RealSubject和Proxy的共用接口

    RealSubject: 定义了Proxy所代表的真实实体

    Proxy类:保存一个RealSubject引用使得代理可以访问实体,并提供一个与RealSubject的接口相同的接口,来代理实体

    例子:王五(RealSubject)让保姆(Proxy)代理自己赵六超市(Supermarket)去买个西瓜(IBuyWatermelon)

    Supermarket

    package com.magggie.proxy;
    
    public  class Supermarket {
         private String name;
    
        public String getName() {
             return name;
        }
    
        public  void setName(String name) {
             this .name = name;
        }
    
        public Supermarket(String name) {
             super ();
             this .name = name;
        }
    
        public Supermarket() {
             super ();
        }
        
    }

    IBuyWatermelon():共用的接口

    package com.magggie.proxy;
    
    public  interface IBuyWatermelon {
         // 代理事件
        public  abstract  void buyWatermelon();
    }

    RealSubjec():被代理者

    package com.magggie.proxy;
    
    public  class RealSubject implements IBuyWatermelon{
         private Supermarket supermaket;
        
        public RealSubject(Supermarket supermaket) {
             super ();
             this .supermaket = supermaket;
        }
    
        public RealSubject() {
             super ();
             // TODO Auto-generated constructor stub 
        }
    
        @Override
        public  void buyWatermelon() {
            System.out.println( "在"+supermaket.getName()+"买西瓜" );
        }
    
    }

    Proxy:代理者

    package com.magggie.proxy;
    
    public  class Proxy implements IBuyWatermelon{
        RealSubject wangWu; // 持有RealSubject的引用
     //     在构造函数时new出RealSubject 
        public Proxy(Supermarket supermarket) {
            wangWu = new RealSubject(supermarket);
        }
    
    
        @Override
        public  void buyWatermelon() {
     // 在方法里调用realsubject的方法
            wangWu.buyWatermelon();
        }
    
    }

    Client调用

    package com.magggie.proxy;
    
    public  class Client {
    
        public  static  void main(String[] args) {
            Supermarket zhaoLiu = new Supermarket();
            zhaoLiu.setName( "赵六超市" );
            
            Proxy hourseKeeper = new Proxy(zhaoLiu);
            
    // 从代理模式可以看出,在客户端只调用Proxy,并没有出现RealSubject 
            hourseKeeper.buyWatermelon();
        }
    
    }

    输出

    在赵六超市买西瓜

    代理模式使得隐藏了RealSubject,有起到安全的作用,实际上有安全代理,用来控制真实对象访问时的权限,还有远程代理,虚拟代理,智能指引等。

    但是当静态代理模式需要代理的方法越来越多时,代码量就越来越多,而且是很傻瓜式地调用RealSubject的方法。

    因此动态代理模式出现了。

  • 相关阅读:
    python 时间差计算
    NET Framework 4.5新特性 (一) 数据库的连接加密保护。
    某表含有N个字段超精简模糊查询方法
    清空javascript数组数据
    IIS无法连接LocalDb,怎么办?
    jquery 模糊查询对象属性
    解释杨中科随机数为什么会骗人?
    前端Js传递数组至服务器端
    javascript获取客户端默认打印机
    水晶报表注意的问题
  • 原文地址:https://www.cnblogs.com/maggiejyt/p/7568306.html
Copyright © 2011-2022 走看看