`

静态代理模式

 
阅读更多

在Java中,静态代理指的是代理类的产生发生在源程序编译阶段,在编译之后生成目标程序中包括代理类的class文件。程序运行时,直接装载代理类,生成代理对象。

静态代理有两种实现方式:继承方式和聚合方式

实例:

有一辆坦克,他可以移动,我们想要在记录它移动一次的时间,即执行move()这个方法所用的时间,同时,又想要在它移动或者记录时间之前或之后记录一些日志。

实现方式:

定义移动的接口类

 Moveable.java

package com.fgh.proxy;

public interface Moveable {
	
	void move();
}

第一个实现类Tank.java

package com.fgh.proxy;

import java.util.Random;

public class Tank implements Moveable {

	public void move() {
		System.out.println("Tank moving.......");
		try {
			Thread.sleep(new Random().nextInt(2000));
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

一、继承方式

TankExten.java

package com.fgh.proxy;

/**
 * 继承方式实现代理
 * @author fgh
 *
 */
public class TankExten extends Tank {
/**
 * 重写父类的方法
 */
	@Override
	public void move() {
		System.out.println("Tank Starting....");
		super.move();
		System.out.println("Tank Stoping.......");
	}

}

二、聚合方式

TankLogProxy.java

 添加打印日志的逻辑

package com.fgh.proxy;

/**
 * 聚合方式实现代理 添加打印日志的逻辑
 * @author fgh
 *
 */

public class TankLogPrxoxy implements Moveable {

	Moveable m;

	public TankLogPrxoxy(Moveable m) {
		super();
		this.m = m;
	}

	public void move() {
		System.out.println("Tank Start...");
		m.move();
		System.out.println("Tank Stop...");
	}
}
TankTimeProxy.java

计算move()方法的执行时间

package com.fgh.proxy;

/**
 * 聚合方式 计算move()方法执行时间
 * @author fgh
 *
 */
public class TankTimeProxy implements Moveable {

	Moveable m;

	public TankTimeProxy(Moveable m) {
		super();
		this.m = m;
	}

	public void move() {
		long start = System.currentTimeMillis();
		System.out.println("StartTime:" + start);
		m.move();
		long end = System.currentTimeMillis();
		System.out.println("Execute Time= " + (end - start)+"ms");
	}

}

测试代码:Client.java

package com.fgh.proxy;

/**
 * 静态代理
 * @author fgh
 *
 */
public class Client {

	public static void main(String[] args) {
		 Tank t = new Tank();
		 //move()方法外面套一层打印日志逻辑
		 TankLogPrxoxy tlp = new TankLogPrxoxy(t);
		//接着在外面套一层计算move()方法执行时间的逻辑
		 TankTimeProxy ttp = new TankTimeProxy(tlp);
		 ttp.move();
//		TankExten te = new TankExten();
//		te.move();
	}
}

总结:继承方式容易造成类的堆叠 假如有100个类 那我们要继承100次

聚合方式比较灵活,推荐使用



分享到:
评论

相关推荐

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

    在这个例子中,"优秀的设计模式示例-静态代理模式"提供了实际项目中的代码实例,旨在帮助开发者更好地理解和应用静态代理模式。 静态代理模式的核心思想是通过代理类来代理原始对象(也称为真实对象或服务对象),...

    Java 静态代理模式

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

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

    静态代理模式是设计模式中的一种,它属于结构型模式,主要用来在不修改原有对象的基础上,通过一个代理对象来增强或扩展原对象的功能。在本篇文章中,我们将深入探讨静态代理模式的概念、工作原理以及其优缺点。 ##...

    java 设计模式之代理模式(Proxy Pattern)实现代码及设计详解:动态代理模式、静态代理模式

    下面是一个简单的静态代理模式示例: ```java public interface Service { void doSomething(); } public class RealService implements Service { @Override public void doSomething() { // 实现具体业务...

    JavaSE065静态代理模式深度剖析.docx

    在Java编程中,静态代理模式是一种设计模式,它允许我们在不修改原始对象代码的情况下,通过创建一个代理类来扩展或增强对象的功能。静态代理模式在Java SE中有着广泛的应用,特别是在需要控制对某个对象访问或者...

    Spring学习笔记(12)----静态代理模式分析演示

    在本篇Spring学习笔记中,我们将探讨静态代理模式在Spring框架中的应用与分析。静态代理是一种常见的设计模式,它在不修改目标类代码的情况下,通过代理类来扩展或增强目标类的功能。在Spring中,静态代理主要应用于...

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

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

    java 设计模式 静态代理模式

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

    代理模式_静态代理.zip

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

    spring+静态代理

    在本主题"spring+静态代理"中,我们将深入探讨如何利用Spring框架来实现静态代理模式,并通过接口回调的方式来增强代码的灵活性和可扩展性。 静态代理是一种设计模式,它允许我们在不修改原始对象(被代理对象)的...

    包含静态代理和动态代理demo代码

    以下是一个简单的静态代理模式的步骤: 1. 定义一个接口,如`Service`,其中声明了需要被代理的方法。 2. 创建真实类(Target)实现`Service`接口,实现具体业务逻辑。 3. 创建代理类(Proxy)同样实现`Service`...

    Spring模拟aop静态代理案例

    总结起来,这个案例旨在通过Spring AOP的静态代理模式,帮助开发者掌握如何在不改变原有业务逻辑的情况下,插入额外的行为,从而提升代码的灵活性和可扩展性。同时,理解和实践这个案例,也能加深对面向切面编程的...

    JAVA静态代理和动态代理

    以下是一个简单的静态代理模式示例: 1. 定义接口: ```java public interface Service { void doSomething(); } ``` 2. 实现目标对象: ```java public class RealService implements Service { @Override ...

    Java代理模式模板代码,包含动态代理与静态代理

    以下是一个简单的静态代理模式模板代码示例: ```java // 目标接口 public interface Target { void doSomething(); } // 目标类 public class RealTarget implements Target { @Override public void ...

    静态代理案例---线程买票

    在这个静态代理案例中,静态代理模式主要用于增加额外的功能,例如日志记录、权限验证等,而不会影响到核心业务逻辑(购票)。代理类将持有目标对象(售票员),并在调用目标对象方法时进行预处理和后处理。 总的来...

    PHP大牛线上培训班课-静态代理请求对象静态代理.zip

    6. **优缺点分析**:分析了静态代理模式的优点,如解耦、扩展性,以及可能的缺点,如代码量增加、可能导致类结构复杂化等。 7. **实例演示**:通过多个视频教程(如“容器中”、“静态代理_1”、“_2”等),详细...

    JAVA设计模式之代理模式实例

    以下是一个简单的静态代理模式示例: ```java // 目标接口 interface Target { void doSomething(); } // 目标实现类 class RealTarget implements Target { @Override public void doSomething() { System....

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

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

    设计模式之_代理模式

    以下是一个简单的静态代理模式示例: 1. **接口SelfInterface**:定义了代理和真实对象共同实现的方法,例如: ```java public interface SelfInterface { void doSomething(); } ``` 2. **真实对象RedWine**:...

    代理模式详解

    以数据库连接管理为例,展示如何使用静态代理模式: 1. **接口定义**:首先定义一个`Connection`接口,其中包含基本的数据库操作方法,例如`createStatement()`和`close()`等。 ```java public interface ...

Global site tag (gtag.js) - Google Analytics