`

Java静态代理(代理模式)

 
阅读更多

1.代理模式作用:

为其他对象提供一种代理以控制对这个对象的访问。(类似中介,可以为你做事,也同时实现自己的事。例如找房子,中介可以实现租房,同时中介可以收取一定费用)代理访问你要访问对象(中介代替租房者去访问房东租房)。

2.代理角色:

  • 抽象角色:声明真实对象和代理对象的共同接口。(例如租房(租房是接口的一个行为),中介和房东都能完成租房的这个动作)
  • 代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以再执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。(中介就是代理角色)
  • 真实角色:代理角色所代表的真实对象,是最终要引用的对象。(真实角色是房东)

 

package com.test.proxy;
/**
 * 定义一个抽象类,静态代理模式可以使用接口或者抽象类
 * @author 守望幸福
 *
 */
public abstract class Subject {
	public abstract void request();
}
package com.test.proxy;
/**
 * 代理类实现Subject抽象类,同时拥有真实对象的引用(private RealSubject realSubject;)
 * 代理必须完成真实对象的动作,也可以添加自己的动作。
 * @author 守望幸福
 *
 */
public class ProxySubject extends Subject {
	
	private RealSubject realSubject;//代理角色内部引用真实角色
	@Override
	public void request() {
		this.perRequest();//调用真实类之前调用
		if(realSubject==null){
			realSubject=new RealSubject();
			realSubject.request();//真实角色完成的事情
		}
		this.postRequest();//调用真实类之后调用
	}
	private void perRequest(){
		System.out.println(" per  Request!");
	}
	private void postRequest(){
		System.out.println(" post  Request!");
	}

}
package com.test.proxy;


/**
 * 真实类实现接口(Subject)
 * @author 守望幸福
 *
 */
public class RealSubject extends Subject{

	@Override
	public void request() {
		System.out.println("from realSubject");
	}

}

 

package com.test.proxy;
/**
 * 客户端调用类
 * @author 守望幸福
 *
 */
public class Client {
	public static void main(String[] args) {
		Subject s=new ProxySubject();
		s.request();
	}
}
 

从上例可以观察出,客户实际需要调用的是RealSubject类的request方法,现在通过代理类ProxySubject来代理真实类,也能同样达到调用request的目的 ,同时还封装了其他的方法preRequest、postRequest,来出来另外的问题。

如果按照上诉的方使用代理模式,那么真实角色必须是实现已存在,并将其作为代理对象的内部属性。事实上,一个真实角色必须对应一个代理角色,如果大量使用会导致类的急剧膨胀,而且无法处理事先未知的真实角色。上述问题可以通过动态代理 来解决。

 

分享到:
评论

相关推荐

    Java 静态代理模式

    Java静态代理模式是一种设计模式,它允许我们为一个对象提供一个代理,以便增强或扩展其功能,同时不改变原有对象的代码。在Java中,静态代理是通过在代理类中显式实现目标接口来实现的。下面将详细介绍静态代理模式...

    java静态代理、动态代理、装饰设计模式

    在Java编程中,代理模式是一种常见的设计模式,它允许我们为一个对象提供一个代理以控制对这个对象的访问。代理模式通常用于增加额外的功能或在访问原对象时进行额外的操作,比如日志记录、安全控制、性能统计等。...

    JAVA静态代理和动态代理

    在Java编程语言中,代理模式是一种设计模式,它允许我们为一个对象提供一个代理以控制对这个对象的访问。代理模式通常用于增加额外的功能或在访问原对象时进行额外的操作,比如日志记录、安全控制、性能度量等。Java...

    Java设计模式——代理设计模式(静态代理和动态代理)

    在Java编程中,设计模式是一种解决常见问题的模板或最佳实践,它可以帮助开发者编写更加灵活、可维护和可扩展的代码。代理设计模式是其中的一种,它的主要作用是在...在实际开发中,应根据项目需求选择合适的代理模式。

    Java静态代理与动态代理demo

    Java提供了两种实现代理模式的方式:静态代理和动态代理。 **静态代理** 静态代理是在编译时就已经确定了代理类,通过继承或实现目标接口来创建代理类。以下是一个简单的静态代理实现示例: ```java // 目标接口 ...

    Java静态代理和动态代理

    Java的代理模式通过代理类提供了对委托类的扩展和控制,静态代理适合对已有代码不做修改的情况,而动态代理则提供了更高的灵活性和扩展性。在实际应用中,应根据项目需求和性能考虑选择静态代理或动态代理。对于需要...

    java 静态代理和动态代理学习实例源码

    在Java编程中,代理模式是一种常用的结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。代理模式通常分为静态代理和动态代理两种类型,这两种代理方式各有特点,适用于不同的场景。 **静态代理** ...

    Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理)

    Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理) Java 动态代理是 Java 编程语言中的一种强大工具,广泛应用于 Spring AOP、Hibernate 数据查询、测试框架的后端 mock、RPC 远程调用、Java 注解...

    优秀的设计模式示例-静态代理模式

    随着Java等语言的发展,动态代理(如Java的`java.lang.reflect.Proxy`)和C#的`System.Reflection.Emit`等技术,可以更灵活地创建代理对象,克服了静态代理的部分局限性。 总之,静态代理模式提供了一种在不修改...

    Java代理模式Java动态代理

    ### Java代理模式与Java动态代理详解 #### 一、代理模式概述 代理模式是一种软件设计模式,它在客户端和目标对象之间提供了一种间接层。这种模式的主要目的是控制客户端对目标对象的访问,并且可以在不修改原有...

    代理模式_静态代理.zip

    设计模式之代理模式_静态代理的一个java实现的demo。主类在Client中。仅代码实现,可供初学者参考使用

    Java 代理 代理模式 静态代理与动态代理 常见的动态代理实现 .md

    ### Java 代理模式详解 #### 1. 代理模式概览 代理模式是一种设计模式,主要目的是为了控制或提供对某对象的访问。在代理模式中,代理对象充当客户端与真实对象之间的中介,使得客户端可以通过代理对象间接地访问...

    java静态代理和动态代理详解

    Java中的代理模式是一种设计模式,它允许我们创建一个代理对象,该对象可以在调用实际对象的方法之前或之后执行额外的操作,而无需修改原始代码。在Java中,代理主要分为静态代理和动态代理。 1. 静态代理: 静态...

    java静态代理与动态代理

    ### Java静态代理与动态代理详解 #### 一、代理模式概述 代理模式是软件工程领域中常用的一种设计模式,尤其在Java开发中极为常见。它主要用于控制对某个对象的访问,或者提供额外的功能如日志记录、性能追踪、...

    设计模式(八)之静态代理模式.zip

    在软件设计领域,设计模式是一种经过验证的、通用的解决方案,用于解决常见...在实际开发中,根据项目需求和场景,可以考虑使用动态代理模式(如Java的`java.lang.reflect.Proxy`)来克服这些缺点,实现更灵活的代理。

    java 设计模式 静态代理模式

    //代理模式内部引用了真实角色 public void requst() { this.preRequest(); //在真实角色操作之前所附加的操作 if(null == realsubject) { realsubject = new ReallSubject(); } realsubject.requst(); // ...

Global site tag (gtag.js) - Google Analytics