zoukankan      html  css  js  c++  java
  • 【设计模式】—— 代理模式Proxy

      前言:【模式总览】——————————by xingoo

      模式意图

      代理模式为其他的对象增加一个代理对象,进行访问控制。从而避免直接访问一个对象,造成效率或者安全性上的降低。

      应用场景

      1 远程代理,为一个远程对象,创建一个本地的代理对象。每次访问,直接访问本地代理对象即可。

      2 虚代理,如果对象很大,直接访问开销很大,可以为他创建一个代理对象,只生成关键的信息即可。

      3 保护代理,为某个对象增加一种保护机制,只有一定的权限才能通过这个代理,访问后面的对象。

      4 智能指针,有点像C++里面的那个智能指针,为指针进行计数和销毁等操作。避免出现悬垂指针等现象。

      模式结构

      Subject 类接口,定义代理类,实现类等的规范。

    interface Subject{
        public void request();
    }

      RealSubject 真正的对象

    class RealSubject implements Subject{
        public void request() {
            System.out.println("ConcreteSubject request()");
        }
    }

      ProxySubject 代理类,可以对真正的实现部分加上一种类似装饰的效果。看!多像AOP

    class ProxySubject implements Subject{
        private RealSubject subject;
        
        public void request() {
            preRequest();
            
            if(subject == null){
                subject = new RealSubject();
            }
            subject.request();
            
            postRequest();
        }
        
        public void preRequest(){
            System.out.println("ConcreteSubject preRequest()");
        }
        
        public void postRequest(){
            System.out.println("ConcreteSubject postRequest()");
        }
    }

      全部代码

     1 package com.xingoo.Proxy;
     2 interface Subject{
     3     public void request();
     4 }
     5 class ProxySubject implements Subject{
     6     private RealSubject subject;
     7     
     8     public void request() {
     9         preRequest();
    10         
    11         if(subject == null){
    12             subject = new RealSubject();
    13         }
    14         subject.request();
    15         
    16         postRequest();
    17     }
    18     
    19     public void preRequest(){
    20         System.out.println("ConcreteSubject preRequest()");
    21     }
    22     
    23     public void postRequest(){
    24         System.out.println("ConcreteSubject postRequest()");
    25     }
    26 }
    27 class RealSubject implements Subject{
    28     public void request() {
    29         System.out.println("ConcreteSubject request()");
    30     }
    31 }
    32 public class Client {
    33     public static void main(String[] args) {
    34         Subject subject = new ProxySubject();
    35         subject.request();
    36     }
    37 }
    View Code

      运行结果

    ConcreteSubject preRequest()
    ConcreteSubject request()
    ConcreteSubject postRequest()
  • 相关阅读:
    存储过程
    .Net经典面试题
    《锋利的Jquery》
    WPF-1
    ios-5-类别和协议
    ios-4-创建单例模式
    ios-3-简单内存管理
    ios-2
    ios -1
    <<ASP.NET MVC4 Web编程>>笔记
  • 原文地址:https://www.cnblogs.com/xing901022/p/4068850.html
Copyright © 2011-2022 走看看