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()
  • 相关阅读:
    ASP.NET 2.0的页面缓存功能介绍
    我对针对接口编程的浅解
    接口和抽象类的区别
    面向接口编程到底有什么好处
    泛型编程是什么
    方法的重写、重载及隐藏
    基于事件的编程有什么好处
    Socket Remoting WebService对比
    技术讲座:.NET委托、事件及应用兼谈软件项目开发
    ny589 糖果
  • 原文地址:https://www.cnblogs.com/xing901022/p/4068850.html
Copyright © 2011-2022 走看看