为了账号安全,请及时绑定邮箱和手机立即绑定

【学习打卡】第7天 Java设计模式精讲-Debug方式+内存分析 第十六讲

【学习打卡】第7天 Java设计模式精讲-Debug方式+内存分析 第十六讲

课程名称:Java设计模式精讲-Debug方式+内存分析,真正学懂设计模式

课程章节: 代理模式+Coding+源码解析

主讲老师:Geely

课程内容:

今天学习的内容包括:

什么是代理模式   代理模式 优点 缺点  Coding  源码解析 以及在业务上的应用

课程收获:

代理模式

代理 定义与类型

1.定义

 为其他对象提供一种代理,以控制对这个对象的访问

1.1 特点

   代理对象在客户端和目标对象之间起到中介的作用

1.2 类型  : 结构型

2.适用场景

   1、保护目标对象

   2、增强目标对象

3.缺点

  1.代理模式会造成系统设计中类的数目增加

  2.在客户端和目标对象增加一个代理对象,会造成请求处理速度变慢

  3.增加系统的复杂度

4.优点

    1.代理模式能将代理对象与真实被调用的目标对象分离

    2.一定程度上降低了系统的耦合度,扩展性好

    3.保护目标对象

    4.增强目标对象

5.代理-扩展

 静态代理

 动态代理

 CGLib 代理 继承 finaly 修饰符

6.Spring 代理选择-扩展

 当Bean 有实现接口时 ,Spring 就会用JDK 的动态代理

 当Bean 没有实现接口时 Spring使用CGlib

6.uml 设计图

https://img1.sycdn.imooc.com//62f258930001120c16741182.jpg

8.代码如下

package com.zw.design.pattern.creational.structural.proxy;

import lombok.Data;

@Data
public class Order {

    private  Object orderInfo;
    private  Long   userId;

}
package com.zw.design.pattern.creational.structural.proxy;

public interface IOrderDao {
    int  insert (Order order);
}
package com.zw.design.pattern.creational.structural.proxy;

public  class IOrderDaoImpl  implements IOrderDao {
    @Override
    public int insert(Order order) {
        System.out.println("DAO 层添加order 成功");
        return 1;
    }
}
package com.zw.design.pattern.creational.structural.proxy;

public interface IOrderService {
    int saveOrder(Order order);
}

package com.zw.design.pattern.creational.structural.proxy;

public class IOrderServiceImpl implements  IOrderService{

    private IOrderDao IOrderDao;

    @Override
    public int saveOrder(Order order) {
        IOrderDao=new IOrderDaoImpl();
        System.out.println("order = service层调用dao层 " + order);
        return IOrderDao.insert(order);
    }
}
//spring分库思想
package com.zw.design.pattern.creational.structural.proxy.db;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

public class DynamicDataSource extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
        return DataSourceContextHolder.getDbType();
    }
}

package com.zw.design.pattern.creational.structural.proxy.db;

public class DataSourceContextHolder {

    private static  final  ThreadLocal<String> CONTEXT_HOLDER=new ThreadLocal<String>();


    public static  void setDbType(String dbType){
        CONTEXT_HOLDER.set(dbType);
    }
    public static  String getDbType(){
        return CONTEXT_HOLDER.get();
    }

    public static void clearDBType(){
        CONTEXT_HOLDER.remove();
    }
}

静态代理类

package com.zw.design.pattern.creational.structural.proxy.staticproxy;

import com.zw.design.pattern.creational.structural.proxy.IOrderService;
import com.zw.design.pattern.creational.structural.proxy.IOrderServiceImpl;
import com.zw.design.pattern.creational.structural.proxy.Order;
import com.zw.design.pattern.creational.structural.proxy.db.DataSourceContextHolder;

/****
 * 静态代理
 */
public class OrderServiceStaticProxy {

    private IOrderService iOrderService;


    public int saveOrder(Order order){
        beforeMethod();
        iOrderService=new IOrderServiceImpl();
        Long userId=order.getUserId();
        //开始业务操作
        int dbRouter= (int) (userId%2);
        System.out.println("dbRouter = 静态代理分配到 db" + dbRouter +"处理数据");
        //TODO 设置dataSource 这里有spring 分库的思想 ;
        DataSourceContextHolder.setDbType(String.valueOf(dbRouter));
        afterMethod();
        return  iOrderService.saveOrder(order);
    }

    private void beforeMethod(){
        System.out.println("静态代理 before  code");
    }

    private void afterMethod(){
        System.out.println("静态代理 after code ");
    }

}

3.测试类

package com.zw.design.pattern.creational.structural.proxy.staticproxy;

import com.zw.design.pattern.creational.structural.proxy.Order;

public class Test {
    public static void main(String[] args) {
        Order order=new Order();
        order.setUserId(2L);
        OrderServiceStaticProxy cs=new OrderServiceStaticProxy();
        int i = cs.saveOrder(order);
    }
}

测试结果如下

https://img1.sycdn.imooc.com//62f258a60001d89c15380332.jpg

代码如下

代理模式在spring框架当中的应用ProxyFactoryBean

https://img1.sycdn.imooc.com//62f258b40001780720000858.jpg

还有JdkDynamicAopProxy CglibAopProxy

mybatis 当中的代理类 比如MapperProxyFactory 如图所示 使用了jdk 原生动态代理

https://img1.sycdn.imooc.com//62f258cb000172cf20841208.jpgimage-20220731100716749

https://img1.sycdn.imooc.com//62f258d50001590126901380.jpg

今天学习课程共用了2个小时,重新学习一下设计模式 更加清楚知道代理模式的应用以及如何在自己项目当中去使用它  大家一起加油 💪🏻








点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消