Java中的装饰模式、静态代理与动态代理

本文介绍了Java中的装饰模式和代理模式的应用。装饰模式通过继承扩展功能,代理模式则增加了对对象行为的控制。文章详细解释了静态代理和动态代理的区别,并提供了具体的实现代码。

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小辰~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值