【设计模式】代理模式 ( 静态代理 )

2023-03-29 15:34:47 浏览数 (1)

文章目录

  • 一、静态代理代码示例
    • 1、订单类
    • 2、Service 接口
    • 3、Service 实现类
    • 4、Service 静态代理类
    • 5、Dao 接口
    • 6、Dao 实现类
    • 7、测试类

一、静态代理代码示例


业务场景 : 保存订单信息 , 在 Service 层处理订单保存 , 在 Dao 层将订单存储到数据库 ; 使用静态代理类加强 Service 层的功能 ;

1、订单类

代码语言:javascript复制
package proxy;

/**
 * 订单类
 *      存储订单时 , 通过 Service 层通接收 Order 对象进行处理
 */
public class Order {
    /**
     * 订单信息
     */
    private Object orderInfo;

    /**
     * 用户 ID
     */
    private Integer userId;

    public Order(Object orderInfo, Integer userId) {
        this.orderInfo = orderInfo;
        this.userId = userId;
    }

    public Object getOrderInfo() {
        return orderInfo;
    }

    public void setOrderInfo(Object orderInfo) {
        this.orderInfo = orderInfo;
    }

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }
}

2、Service 接口

代码语言:javascript复制
package proxy;

/**
 * 服务接口
 */
public interface IOrderService {
    /**
     * 保存订单
     * @param order 数据库生效行数
     * @return
     */
    int saveOrder(Order order);
}

3、Service 实现类

代码语言:javascript复制
package proxy;

public class OrderServiceImpl implements IOrderService {
    private IOrderDao iOrderDao;

    public OrderServiceImpl(IOrderDao iOrderDao) {
        this.iOrderDao = iOrderDao;
    }

    @Override
    public int saveOrder(Order order) {
        System.out.println("Service 层插入 Order 订单信息成功");
        return this.iOrderDao.insert(order);
    }
}

4、Service 静态代理类

代码语言:javascript复制
package proxy;

/**
 * 订单服务静态代理类
 */
public class OrderServiceStaticProxy {
    private IOrderService iOrderService;

    public OrderServiceStaticProxy(IOrderService iOrderService) {
        this.iOrderService = iOrderService;
    }

    public int saveOrder(Order order){
        beforeMethod();
        int result = iOrderService.saveOrder(order);
        afterMethod();
        return result;
    }

    /**
     * 在被代理对象方法之前执行的内容
     */
    private void beforeMethod() {
        System.out.println("静态代理 OrderServiceStaticProxy 执行 saveOrder 之前");
    }

    /**
     * 在被代理对象方法之后执行的内容
     */
    private void afterMethod() {
        System.out.println("静态代理 OrderServiceStaticProxy 执行 saveOrder 之后");
    }
}

5、Dao 接口

代码语言:javascript复制
package proxy;

/**
 * 数据库接口
 */
public interface IOrderDao {
    /**
     * 向数据库中插入订单信息
     * @param order
     * @return
     */
    int insert(Order order);
}

6、Dao 实现类

代码语言:javascript复制
package proxy;

public class OrderDaoImpl implements IOrderDao {
    @Override
    public int insert(Order order) {
        System.out.println("Dao 层插入 Order 订单信息成功");
        return 1;
    }
}

7、测试类

代码语言:javascript复制
package proxy;

public class Main {
    public static void main(String[] args) {
        Order order = new Order("书籍订单", 1);

        IOrderDao dao = new OrderDaoImpl();
        IOrderService service = new OrderServiceImpl(dao);

        // 不使用代理的情况
        service.saveOrder(order);

        System.out.println();

        // 使用代理的情况
        OrderServiceStaticProxy proxy = new OrderServiceStaticProxy(service);
        proxy.saveOrder(order);

    }
}

执行结果 :

代码语言:javascript复制
Service 层插入 Order 订单信息成功
Dao 层插入 Order 订单信息成功

静态代理 OrderServiceStaticProxy 执行 saveOrder 之前
Service 层插入 Order 订单信息成功
Dao 层插入 Order 订单信息成功
静态代理 OrderServiceStaticProxy 执行 saveOrder 之后

0 人点赞