java23设计模式---class11.代理模式(Proxy)

一、静态代理

1、定义

我们什么时候会用到代理模式呢?主要是在测试时,例如测试时间和打印日志等情况。

2、角色

角色主要有接口、被代理者、代理类。其关系如下图,我们发现,被代理的具体实现类和代理抽象类都会实现一个统一的接口

在这里插入图片描述

3、优缺点

1)优点

1、降低耦合度,客户端只需要与代理类打交道,而不需要知道被代理者有什么属性有什么方法。
2、

4、应用背景

5、代码实现

//接口

package pattern.proxy.version1;

public interface Runnable {
    
    
void run();
}

//具体被代理实现类(系统A、系统B)

package pattern.proxy.version1;

import java.util.Random;

public class SystemA implements Runnable{
    
    

	@Override
	public void run() {
    
    
		// TODO Auto-generated method stub
		try {
    
    
			Thread.sleep(new Random().nextInt(8888));
		} catch (InterruptedException e) {
    
    
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("SystemA was carried out!");
	}

}
package pattern.proxy.version1;

import java.util.Random;

public class SystemB implements Runnable{
    
    

	@Override
	public void run() {
    
    
		// TODO Auto-generated method stub
		try {
    
    
			Thread.sleep(new Random().nextInt(8888));
		} catch (InterruptedException e) {
    
    
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("System B was carried out");
	}

}

//抽象代理类

package pattern.proxy.version1;

public abstract class AbstractProxy implements Runnable{
    
    
Runnable system;
public AbstractProxy(Runnable system) {
    
    
	this.system=system;
}
public abstract void run();
}

//具体代理类Time代理和Log代理

package pattern.proxy.version1;

public class TimeProxy extends AbstractProxy{
    
    
	
	public TimeProxy(Runnable system) {
    
    
		super(system);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void run() {
    
    
		// TODO Auto-generated method stub
		long start=System.currentTimeMillis();
		system.run();//可以直接用父类的属性
		long end=System.currentTimeMillis();
		System.out.println("总运行"+(end-start)+"毫秒");
	}

}
package pattern.proxy.version1;

public class LogProxy extends AbstractProxy{
    
    

	public LogProxy(Runnable system) {
    
    
		super(system);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void run() {
    
    
		// TODO Auto-generated method stub
		System.out.println("start----------");
		system.run();
		System.out.println("stop----------");
	}

}

//测试类

package pattern.proxy.version1;

public class Client {
    
    
public static void main(String[] args) {
    
    
	
	new TimeProxy(new LogProxy(new SystemA())).run();
	new LogProxy(new TimeProxy(new SystemB())).run();
}
}

结果展示:
在这里插入图片描述

二、动态代理

应用:AOP······

猜你喜欢

转载自blog.csdn.net/m0_51801058/article/details/114308067