Java中的装饰模式、静态代理与动态代理
装饰模式
装饰模式分为以下几种角色:被装饰的对象(主题)、实现主题、装饰者。
装饰模式一般用于对原有对象功能的扩展。
被装饰的对象(主题):
public interface CarService {
//车载音乐
void music();
}
实现主题:
public class CarServiceImpl implements CarService {
@Override
public void music() {
System.out.println("车载音乐功能...");
}
}
装饰者:
装饰者包含原主题的所有功能
public class CarDecorator implements CarService {
private CarService carService;
//装饰者需要持有主题的一个引用
public CarDecorator(CarService carService){
this.carService = carService;
}
@Override
public void music() {
carService.music();
}
}
装饰者1:
public class CarConcrete01 extends CarDecorator{
public CarConcrete01(CarService carService) {
super(carService);
}
@Override
public void music() {
super.music();
System.out.println("车载音乐新增搜索功能...");
}
}
装饰者2:
public class CarConcrete02 extends CarDecorator{
public CarConcrete02(CarService carService) {
super(carService);
}
@Override
public void music() {
super.music();
System.out.println("车载音乐新增定时功能...");
}
}
测试类:
public class TestMain {
public static void main(String[] args) {
System.out.println("------ 装饰者1 ------");
CarConcrete01 carConcrete01 = new CarConcrete01(new CarImpl());
carConcrete01.music();
System.out.println("------ 装饰者2 ------");
CarConcrete02 carConcrete02 = new CarConcrete02(new CarImpl());
carConcrete02.music();
}
}
运行结果:
------ 装饰者1 ------
车载音乐功能...
车载音乐新增搜索功能...
------ 装饰者2 ------
车载音乐功能...
车载音乐新增定时功能...
静态代理与动态代理
静态代理代理类在编译期生成,动态代理代理类在运行时动态生成。
静态代理
静态代理与装饰模式很像,但静态代理重在对被代理的类增加控制。
静态代理由三种组成:代理类、委托类和接口。
静态代理中代理类和委托类必须实现同一个接口。
接口:
public interface CarService {
void start();
}
委托类:
public class CarServiceImpl implements CarService {
@Override
public void start() {
System.out.println("汽车启动...");
}
}
代理类:
public class CarServiceProxy implements CarService {
private CarService carService;
public CarServiceProxy (CarService carService){
this.carService = carService;
}
@Override
public void start() {
long startTime = System.nanoTime();
carService.start();
long endTime = System.nanoTime();
System.out.println("汽车启动时间:" + (endTime-startTime));
}
}
测试类:
public class TestMain {
public static void main(String[] args) {
CarServiceProxy carProxy = new CarServiceProxy(new CarServiceImpl());
carProxy.start();
}
}
运行结果:
汽车启动...
汽车启动时间:242147
动态代理
代理由三种组成:代理类、委托类和接口。
动态代理不要求代理类和委托类实现同一接口,只要委托类实现接口,而代理类实现InvocationHandler接口并通过反射的方式获取代理类的构造方法,去调用代理类的方法。
接口:
public interface CarService {
//汽车启动
void start();
//播放音乐
void music();
}
委托类:
public class CarServiceImpl implements CarService {
@Override
public void start() {
System.out.println("汽车启动...");
}
@Override
public void music() {
System.out.println("开启音乐...");
}
}
代理类:
import java.lang.reflect.Proxy;
public class CarServiceProxy {
private CarService carService;
public CarServiceProxy(CarService carService) {
this.carService = carService;
}
public Object getProxyInstance() {
return Proxy.newProxyInstance(carService.getClass().getClassLoader(), carService.getClass().getInterfaces(), (proxy, method, args) -> {
System.out.println("代理类-carService-start");
Object invoke = method.invoke(carService, args);
System.out.println("代理类-carService-end");
return invoke;
});
}
}
测试:
public class TestMain {
public static void main(String[] args) {
CarService carService = new CarServiceImpl();
CarService proxy = (CarService) new CarServiceProxy(carService).getProxyInstance();
proxy.start();
proxy.music();
}
}
运行结果:
代理类-carService-start
汽车启动...
代理类-carService-end
代理类-carService-start
开启音乐...
代理类-carService-end
本文介绍了Java中的装饰模式和代理模式的应用。装饰模式通过继承扩展功能,代理模式则增加了对对象行为的控制。文章详细解释了静态代理和动态代理的区别,并提供了具体的实现代码。
781

被折叠的 条评论
为什么被折叠?



