• 代理模式(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)代理模式在客户端和目标对象之间起到一个中介作用,这样可以起到保护目标对象的作用。代理对象也可以对目标对象调用之前进行其他操作。

    代理模式的应用形式

    远程代理:可以为一个不同的地址空间的对象提供一个局域代表对象;
    虚拟代理:根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建;
    安全代理:基于访问权限可以控制对一个对象的访问;
    智能指引:调用真实对象时,代理可以处理另外的事情。
  • 相关阅读:
    JavaScript 倒计时脚本
    SQL Server 中的事务和锁
    Asp.net MVC 3 开发企业网站系统仿照博客园部分功能总体设计
    Windows RT 应用程序开发介绍培训的讲义
    Wcf异步调用简单示例
    asp.net搜索引擎(网络爬虫)设计及研发
    Twitter Storm RealLife App 排错记
    写个软件来防止服务器网站CPU百分百
    ALinq Dynamic
    .NET的跨平台调用一例(PreserveSig)
  • 原文地址:https://www.cnblogs.com/Actexpler-S/p/7469607.html
Copyright © 2020-2023  润新知