Spring引入静态代理解决OCP开闭原则的增强对象功能的实现-----Spring框架

文章讨论了类和类之间的泛化关系(继承)与关联关系的区别,强调了在设计中应优先选择关联关系以降低耦合度。同时,介绍了Spring中的服务接口和代理模式,以及其在OCP原则的应用和可能的缺点——类爆炸和高耦合。
摘要由CSDN通过智能技术生成
类和类之间的关系有六种,泛化关系(继承),关联关系
泛化关系Cat is a Animal
public class Animal{} public class Cat extends Animal{}
关联关系has a
I has a pen,i has an apple
张三 has a pen
public class Person{private Apple apple} public class Apple{}在一个类的里面有另一个类
相比来说,泛化关系耦合度高于关联关系,优先选择关联关系
类和类之间的关系有六种,泛化关系(继承),关联关系
泛化关系Cat is a Animal
public class Animal{} public class Cat extends Animal{}
关联关系has a
I has a pen,i has an apple
张三 has a pen
public class Person{private Apple apple} public class Apple{}在一个类的里面有另一个类
相比来说,泛化关系耦合度高于关联关系,优先选择关联关系
package com.powernode.proxy.service;

import org.springframework.stereotype.Service;

@Service
public interface OrderService//订单业务接口,也是代理对象和目标对象的公共接口
{
    //生成订单
    void generate();
    //修改订单信息
    void Modify();
    //查看订单明细
    void detail();
}
package com.powernode.proxy.service;

import org.springframework.stereotype.Service;

@Service
public interface OrderService//订单业务接口,也是代理对象和目标对象的公共接口
{
    //生成订单
    void generate();
    //修改订单信息
    void Modify();
    //查看订单明细
    void detail();
}
package com.powernode.proxy.service.impl;

import com.powernode.proxy.service.OrderService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

//缺点一:违背了OCP开闭原则,在运行良好的代码上进行了硬编码修改
//缺点二:代码没有得到复用,相同的代码写了很多遍

@Service
public class OrderServiceImpl implements OrderService
{
    private static final Logger logger = LoggerFactory.getLogger(OrderServiceImpl.class);
    @Override
    public void generate()//目标方法
    {
        //模拟网络延迟,模拟生成延迟
        try {
            Thread.sleep(1234);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        logger.info("订单已生成");
    }

    @Override
    public void Modify()
    {
        //模拟网络延迟,模拟生成延迟
        try {
            Thread.sleep(456);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        logger.info("订单已修改");
    }

    @Override
    public void detail()
    {
        //模拟网络延迟,模拟生成延迟
        try {
            Thread.sleep(111);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        logger.info("订单详情如下");
    }
}
package com.powernode.proxy.service.impl;

import com.powernode.proxy.service.OrderService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

//缺点一:违背了OCP开闭原则,在运行良好的代码上进行了硬编码修改
//缺点二:代码没有得到复用,相同的代码写了很多遍

@Service
public class OrderServiceImpl implements OrderService
{
    private static final Logger logger = LoggerFactory.getLogger(OrderServiceImpl.class);
    @Override
    public void generate()//目标方法
    {
        //模拟网络延迟,模拟生成延迟
        try {
            Thread.sleep(1234);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        logger.info("订单已生成");
    }

    @Override
    public void Modify()
    {
        //模拟网络延迟,模拟生成延迟
        try {
            Thread.sleep(456);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        logger.info("订单已修改");
    }

    @Override
    public void detail()
    {
        //模拟网络延迟,模拟生成延迟
        try {
            Thread.sleep(111);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        logger.info("订单详情如下");
    }
}
package com.powernode.proxy.service;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class OrderServiceProxy implements OrderService
//代理对象和目标对象都要实现同样的接口,因为他们需要具有相同的功能
//要保障在客户端处两者没有区别,因为客户端处是面向接口编程的
{
    private static final Logger logger = LoggerFactory.getLogger(OrderServiceProxy.class);
    //将目标对象作为代理对象的一个属性,这种关系叫做关联关系,比继承关系耦合度低
    //这就是目标对象,目标对象一定是实现了OrderService接口的,这里要写一个公共接口,因为接口耦合度低
    private OrderService orderService;
    //创建代理对象的时候,传一个目标对象给代理对象
    public OrderServiceProxy(OrderService orderService)
    {
        this.orderService = orderService;
    }
    //我们还是要指向目标对象的目标方法处
    @Override
    public void generate()//代理方法
    {
        //增强功能
        long begin = System.currentTimeMillis();
        //调用目标对象的目标方法
        orderService.generate();
        long end = System.currentTimeMillis();
        long time = end - begin;
        logger.info("耗时" + time);
    }

    @Override
    public void Modify()
    {
        long begin = System.currentTimeMillis();
        //调用目标对象的目标方法
        orderService.Modify();
        long end = System.currentTimeMillis();
        long time = end - begin;
        logger.info("耗时" + time);
    }

    @Override
    public void detail()
    {
        long begin = System.currentTimeMillis();
        //调用目标对象的目标方法
        orderService.detail();
        long end = System.currentTimeMillis();
        long time = end - begin;
        logger.info("耗时" + time);
    }
}
package com.powernode.proxy.service;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class OrderServiceProxy implements OrderService
//代理对象和目标对象都要实现同样的接口,因为他们需要具有相同的功能
//要保障在客户端处两者没有区别,因为客户端处是面向接口编程的
{
    private static final Logger logger = LoggerFactory.getLogger(OrderServiceProxy.class);
    //将目标对象作为代理对象的一个属性,这种关系叫做关联关系,比继承关系耦合度低
    //这就是目标对象,目标对象一定是实现了OrderService接口的,这里要写一个公共接口,因为接口耦合度低
    private OrderService orderService;
    //创建代理对象的时候,传一个目标对象给代理对象
    public OrderServiceProxy(OrderService orderService)
    {
        this.orderService = orderService;
    }
    //我们还是要指向目标对象的目标方法处
    @Override
    public void generate()//代理方法
    {
        //增强功能
        long begin = System.currentTimeMillis();
        //调用目标对象的目标方法
        orderService.generate();
        long end = System.currentTimeMillis();
        long time = end - begin;
        logger.info("耗时" + time);
    }

    @Override
    public void Modify()
    {
        long begin = System.currentTimeMillis();
        //调用目标对象的目标方法
        orderService.Modify();
        long end = System.currentTimeMillis();
        long time = end - begin;
        logger.info("耗时" + time);
    }

    @Override
    public void detail()
    {
        long begin = System.currentTimeMillis();
        //调用目标对象的目标方法
        orderService.detail();
        long end = System.currentTimeMillis();
        long time = end - begin;
        logger.info("耗时" + time);
    }
}
package com.powernode.proxy.client;

import com.powernode.proxy.Spring6Config;
import com.powernode.proxy.service.OrderService;
import com.powernode.proxy.service.OrderServiceProxy;
import com.powernode.proxy.service.impl.OrderServiceImpl;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Test
{
    public static void main(String[] args)
    {
//        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Spring6Config.class);
//        OrderService orderService = context.getBean("orderServiceImpl", OrderServiceImpl.class);
//        orderService.detail();
//        orderService.generate();
//        orderService.Modify();
        //缺点1:虽然解决了OCP开闭原则,但是这种方法会导致耦合程度很高,继承关系是一种耦合度非常高的关系,不建议使用
        //缺点2:代码没有得到复用
//        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Spring6Config.class);
//        OrderService orderService = context.getBean("orderServiceImplSub", OrderServiceImplSub.class);
//        orderService.detail();
//        orderService.generate();
//        orderService.Modify();
        //创建目标对象
        //代理模式的优点:解决了OCP开闭问题
        //代理模式的缺点:类爆炸,假设系统内有1000个这样的类,每个接口都要对应一个代理类,不好维护
        //怎么解决,使用动态代理(字节码生成技术)还是代理模式,添加了字节码生成技术,在内存中动态生成字节码动态代理技术
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Spring6Config.class);
        OrderService orderService = context.getBean("orderServiceImpl", OrderServiceImpl.class);
        //创建代理对象
        OrderService OS = new OrderServiceProxy(orderService);
        //调用代理对象的代理方法
        OS.generate();
        OS.Modify();
        OS.detail();
    }
}
package com.powernode.proxy.client;

import com.powernode.proxy.Spring6Config;
import com.powernode.proxy.service.OrderService;
import com.powernode.proxy.service.OrderServiceProxy;
import com.powernode.proxy.service.impl.OrderServiceImpl;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Test
{
    public static void main(String[] args)
    {
//        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Spring6Config.class);
//        OrderService orderService = context.getBean("orderServiceImpl", OrderServiceImpl.class);
//        orderService.detail();
//        orderService.generate();
//        orderService.Modify();
        //缺点1:虽然解决了OCP开闭原则,但是这种方法会导致耦合程度很高,继承关系是一种耦合度非常高的关系,不建议使用
        //缺点2:代码没有得到复用
//        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Spring6Config.class);
//        OrderService orderService = context.getBean("orderServiceImplSub", OrderServiceImplSub.class);
//        orderService.detail();
//        orderService.generate();
//        orderService.Modify();
        //创建目标对象
        //代理模式的优点:解决了OCP开闭问题
        //代理模式的缺点:类爆炸,假设系统内有1000个这样的类,每个接口都要对应一个代理类,不好维护
        //怎么解决,使用动态代理(字节码生成技术)还是代理模式,添加了字节码生成技术,在内存中动态生成字节码动态代理技术
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Spring6Config.class);
        OrderService orderService = context.getBean("orderServiceImpl", OrderServiceImpl.class);
        //创建代理对象
        OrderService OS = new OrderServiceProxy(orderService);
        //调用代理对象的代理方法
        OS.generate();
        OS.Modify();
        OS.detail();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值