`
xieyaxiong
  • 浏览: 41114 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

design pattern——代理模式

 
阅读更多

针对问题:  在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

      代理模式和装饰模式很相似,不同之处在于代理模式是给主题添加控制,但是这些控制来自代理自身的实现,不像装饰模式一样添加的功能来自己主题的子类提供。

      装饰模式可以装饰很多次来得到自己想要的实体,类似的代理模式也可以代理很多次,但通常不会这种做,因为这不是代理模式的目的。装饰模式的目的是添加功能,而代理模式的目的是添加控制。

 

 

 

 

 

代理模式结构图:


 

 

 

 

 

代理模式实现代码:

 

 

/**
 * 抽象主题类
 * @author bruce
 *
 */
public abstract class Subject {
	
	public abstract void request();

}




/**
 * 具体主题类
 * @author bruce
 *
 */
public class RealSubject extends Subject{

	@Override
	public void request() {
		// TODO Auto-generated method stub
		System.out.println("real do something");
	}

}





/**
 * 代理类
 * @author bruce
 *
 */
public class Proxy extends Subject{
	
	private Subject subject;
	
	public Proxy(Subject subject){
		this.subject=subject;
	}

	@Override
	public void request() {
		// TODO Auto-generated method stub
		doBefore();
		subject.request();
		doAfter();
	}
	
	private void doBefore(){
		System.out.println("before doing something");
	}
	
	private void doAfter(){
		System.out.println("after doing something");
	}

}




/**
 * 测试
 * @author bruce
 *
 */
public class Client {
	
	public static void main(String[] args) {
		Subject subject=new Proxy(new RealSubject());
		
		subject.request();
		
		/**
		 * output:
		    before doing something
			real do something
			after doing something
		 */
	}

}

 

 

 

 

 

 

 

 

动态代理模式:代理模式只能在运行前写好,也就是说是静态的,而动态代理可以在运行时期创建(运用反射)

 

 

 

动态代理模式实现代码:

 

 

/**
 * 抽象主题类
 * @author bruce
 *
 */
public interface Subject {
	
	public void requestA();
	
	public void requestB();
	

}




/**
 * 具体主题类
 * @author bruce
 *
 */
public class RealSubject implements Subject{

	public void requestA() {
		// TODO Auto-generated method stub
		System.out.println("do A");
	}

	public void requestB() {
		// TODO Auto-generated method stub
		System.out.println("do B");
	}

}






/**
 * 代理内容实现
 * @author bruce
 *
 */
public class SubjectProxy implements InvocationHandler{
	
	private Object object;
	
	public SubjectProxy(Object object){
		this.subject=subject;
	}

	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		// TODO Auto-generated method stub
		Object object;
		if(method.getName().equals("requestA")){
			System.out.println("allow to do requestA method");
			object=method.invoke(subject, args);
			return object;
		}else if(method.getName().equals("requestB")){
			System.out.println("not allow to do requestB method");
			return null;
		}else{
			System.out.println("other method");
		}
		return null;
	}

}






/**
 * 测试
 * @author bruce
 *
 */
public class Client {
	
	public static void main(String[] args) {
		
		RealSubject subject=new RealSubject();
		
		Subject proxy=(Subject)Proxy.newProxyInstance(subject.getClass().getClassLoader(), subject.getClass().getInterfaces(), new SubjectProxy(subject));
		System.out.println("------------");
		proxy.requestA();
		System.out.println("------------");
		proxy.requestB();
		
		
		/**
		 * output:
		 *  ------------
			allow to do requestA method
			do A
			------------
			not allow to do requestB method
		 */
	}

}

  • 大小: 111.8 KB
分享到:
评论

相关推荐

    design-pattern-java.pdf

    实现对象的复用——享元模式(二) 实现对象的复用——享元模式(三) 实现对象的复用——享元模式(四) 实现对象的复用——享元模式(五) 代理模式-Proxy Pattern 设计模式之代理模式(一) 设计模式之代理模式...

    GoF的经典著作设计模式(Design Pattern)

    12. **代理模式**:为其他对象提供一种代理以控制对这个对象的访问,可以实现虚拟代理、安全代理、远程代理等。 13. **命令模式**:将请求封装为一个对象,以便使用不同的请求、队列请求、记录请求日志,或者支持可...

    Head First Design Pattern

    7. **代理模式(Proxy)**:为其他对象提供一种代理以控制对这个对象的访问。代理可以在调用实际对象之前和之后添加额外的操作,例如权限检查或者缓存。 8. **策略模式(Strategy)**:定义了一系列的算法,并将每...

    模式举例代码——设计模式和举例代码

    - 代理模式:为其他对象提供一种代理以控制对这个对象的访问。 3. **行为型模式**: - 责任链模式:将请求沿着处理者链传递,直到某个处理者处理请求。 - 命令模式:将命令封装为对象,以便使用不同的请求、队列...

    Design Pattern FrameworkTM

    为了帮助 .NET 开发者更好地理解和应用这些设计模式,《Head First 设计模式》为 .NET 2.0 特别推出了一个配套文档——《设计模式框架》(Design Pattern FrameworkTM),该文档涵盖了原书中介绍的所有设计模式,并...

    设计模式design-pattern-java.pdf

    代理模式的主要优点是可以隐藏真实的服务对象,以便实现控制访问的目的。 以上是对文档中所涵盖的设计模式基本概念及其核心知识点的概述。设计模式是软件开发中的重要工具之一,掌握它们对于提高编程技能、优化代码...

    GOF之23种设计模式的C#实现:DesignPattern.zip

    通过阅读GOF23种设计模式.docx文档和探索DesignPattern项目中的代码,你可以深入理解每种模式的用途、优点以及如何在C#和.NET Core环境中实现它们。对于想要提升编程技能和代码质量的开发者来说,这是一个宝贵的资源...

    HeadFirst Design Pattern

    这类模式主要关注如何将类或对象组合成更大的结构,如适配器模式(Adapter)、桥接模式(Bridge)、装饰模式(Decorator)、外观模式(Facade)、享元模式(Flyweight)、组合模式(Composite)和代理模式(Proxy)...

    Introduction to Design Pattern in C#

    代理模式(Proxy)提供一个代理对象来控制对另一个对象的访问。这些模式通过组合或封装的方式,可以在不修改现有代码的基础上,灵活地增加系统的可扩展性。 行为型模式专注于对象间的通信,用以实现更加松耦合的...

    design-pattern(设计模式,包括创建型、结构型、行为型三大类共23种常见的设计模式和J2EE常见设计模式等).zip

    - 代理模式:为其他对象提供一种代理以控制对这个对象的访问。 -享元模式:使用共享对象可以有效地支持大量细粒度的对象。 3. 行为型设计模式: - 责任链模式:避免对象之间耦合度过高,通过将请求沿着处理者链...

    Design Pattern

    - 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。 - 装饰模式(Decorator):动态地给一个对象添加一些额外的职责,增加功能而不改变其结构。 - 享元模式(Flyweight):使用共享对象,有效...

    GOF-设计模式-Design Patterns-英文原版-高清-有目录-有页码

    **设计模式**(Design Patterns)是软件工程中的一个重要概念,它是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。本章节将从多个角度对设计模式进行深入探讨。 #### 二、设计模式的基本定义 ...

    设计模式 Head First

    #### 第11章:控制对象访问——代理模式 代理模式提供了一个代理对象,用来控制对真实对象的访问。代理模式可以帮助我们实现懒加载、权限验证等功能,同时还可以在不修改原有对象的基础上增加额外的功能。 #### 第...

    Cocoa design pattern

    代理模式(Proxy Pattern)**:通过代理对象来控制对真实对象的访问,可以增加额外的功能或控制访问权限。在Cocoa中,代理模式被广泛应用于网络请求、延迟加载等场景。 #### 五、核心数据(Core Data) 书中还特别...

    设计模式C++版(pdf版)

    ### 设计模式精解——GoF 23种设计模式解析及C++实现源码 #### 引言 设计模式是软件工程领域中一个极为重要的概念,它代表着一系列被广泛接受的解决特定问题的方法。GoF(Gang of Four)所提出的23种设计模式更是...

    gof设计模式中英双语版

    其中包括适配器模式、桥接模式、组合模式、装饰器模式、外观模式、享元模式和代理模式。这些模式有助于减少类之间的耦合,提高代码的可重用性和可维护性。 3. 行为型模式:这类模式主要关注对象间如何交互和分配...

Global site tag (gtag.js) - Google Analytics