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

    定义:

    代理模式是代理类替代被代理的类执行一些行为,简而言之就是用一个对象来代表另一个对象。

    为什么要是用代理类:

    为被代理的类提供访问控制,也就是降低了被代理的类与其他类的耦合,举个例子,明星拍吻戏的时候不愿意怎么办呢,就可以找个替身,这个替身不就是个代理类吗,降低明星与其他人的接触。

    代理模式的结构:

     

    代理模式源码

    package Proxy;
    /* 
    * 项目名称:desginProject 
    * @author:wzc
    * @date 创建时间:2017年9月3日 下午2:16:36
    * @Description:抽象主题类
    * @parameter  
    *   */
    public interface Subject {
    	//定义一个方法
    	public  void method();
    }
    
    package Proxy;
    /* 
    * 项目名称:desginProject 
    * @author:wzc
    * @date 创建时间:2017年9月3日 下午2:18:13
    * @Description:真实主题类
    * @parameter  
    *   */
    public class realSubject implements Subject{
        //实现方法
    	@Override
    	public void method() {
    		// TODO Auto-generated method stub
    		
    	}
    
    }
    

     编写代理类:

    package Proxy;
    /* 
    * 项目名称:desginProject 
    * @author:wzc
    * @date 创建时间:2017年9月3日 下午2:18:59
    * @Description:代理类
    * @parameter  
    *   */
    public class Proxy implements Subject{
        //要代理那个实现类
    	private Subject subject=null;
        
    	public Proxy() {
    		super();
    	}
    	public Proxy(Subject subject) {
    		super();
    		this.subject = subject;
    	}
    	//实现方法
    	@Override
    	public void method() {
    		before();
    		subject.method(); //为代理者办事
    		after();	
    	}
    	//前置处理
    	public void before(){
    		//doSomething
    	}
    	//后置处理
    	public void after(){
    		//doSomething
    	}
    
    }
    

    代理模式的应用

    现在就以明星和替身的例子完成代理模式代码
    package Proxy;
    /* 
    * 项目名称:desginProject 
    * @author:wzc
    * @date 创建时间:2017年9月3日 下午2:16:36
    * @Description:抽象主题类
    * @parameter  
    *   */
    public interface people{
    	//定义拍武打的行为
    	public  void actions();
    	//定义一个拍吻戏的行为
    	public void kiss();
    }
    
    package Proxy;
    /* 
    * 项目名称:desginProject 
    * @author:wzc
    * @date 创建时间:2017年9月3日 下午2:18:13
    * @Description:真实主题类
    * @parameter  
    *   */
    public class realStar implements people{
    
    	@Override
    	public void actions() {
    		System.out.println("拍动作戏----成功开拍");
    	}
    
    	@Override
    	public void kiss() {
    		System.out.println("拍吻戏-----成功开拍");
    	}
        
    }
    
    package Proxy;
    /* 
    * 项目名称:desginProject 
    * @author:wzc
    * @date 创建时间:2017年9月3日 下午2:18:59
    * @Description:代理类
    * @parameter  
    *   */
    public class Proxy implements people{
        //要代理那个实现类
    	private people star=null;//代理类需要保留一个被代理者的应用,好知道执行谁的行为
        
    	public Proxy() {
    		super();
    	}
    	public Proxy(people star) {
    		super();
    		this.star = star;
    	}
    	//实现接口方法
    	@Override
    	public void actions() {
    		System.out.println("找替身拍武戏");
    		before();
    		star.actions(); //代替被替代者执行
    		after();
    		
    	}
    	//实现接口方法
    	@Override
    	public void kiss() {
    		System.out.println("找替身拍吻戏");
    		before();
    		star.kiss();  //代替被替代者执行
    		after();
    	}
    
    	//前置处理
    	public void before(){
    		System.out.println("上场前,替身需要化妆");
    	}
    	//后置处理
    	public void after(){
    		System.out.println("上场后,替身需要卸妆");
    	}
    	
    }
    

     测试一下

    @Test
    	public void test() {
    		realStar star=new realStar();
    		Proxy proxy=new Proxy(star);
    		System.out.println("明星需要拍武戏");
    		proxy.actions();
    		System.out.println("明星需要拍吻戏");
    		proxy.kiss();
    	}
    

     

    优点:

    1)代理模式能将代理对象与真正被调用的对象分离,在一定程度上降低了系统的耦合度。
    2)代理模式在客户端和目标对象之间起到一个中介作用,这样可以起到保护目标对象的作用。代理对象也可以对目标对象调用之前进行其他操作。

    代理模式的应用形式

    远程代理:可以为一个不同的地址空间的对象提供一个局域代表对象;
    虚拟代理:根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建;
    安全代理:基于访问权限可以控制对一个对象的访问;
    智能指引:调用真实对象时,代理可以处理另外的事情。
  • 相关阅读:
    C# 从服务器下载文件
    不能使用联机NuGet 程序包
    NPOI之Excel——合并单元格、设置样式、输入公式
    jquery hover事件中 fadeIn和fadeOut 效果不能及时停止
    UVA 10519 !! Really Strange !!
    UVA 10359 Tiling
    UVA 10940 Throwing cards away II
    UVA 10079 Pizze Cutting
    UVA 763 Fibinary Numbers
    UVA 10229 Modular Fibonacci
  • 原文地址:https://www.cnblogs.com/Actexpler-S/p/7469607.html
Copyright © 2011-2022 走看看