23种设计模式,代理模式

一,代理模式

  为什么要学习代理模式?因为这就是SpringAOP的底层!【Spring AOP 和SpringMVC】

  代理模式分类:

    静态代理

    动态代理

那到底什么是代理模式呢?

  看图!

 

最佳理解(优点恶趣味):上图的关系可以这么理解(mybatis就是房东,servioce就是中介,controller就是客户

            通俗点也可以看作是 入土,代理帮你火化

              

 

 

1.2静态代理

  角色分析:

    抽象角色:一般会使用接口或抽象类来解决(相当于图上的租房,即 真实角色和代理共同想做的事情)

    真实角色:被代理角色(真正想做事的人)

    代理角色:代理真实角色,代理真实角色后,一般会做一些附属操作

    客户:访问代理对象的人 

 

代码步骤

   1,接口(抽象角色)

//租房
public interface Rent {

    public void rent();

}

  

  2,真实角色

//房东
public class Host implements Rent{

    public void rent() {
        System.out.println("房东要出租房子!");
    }
}

 

  3,代理角色

package com.king.demo01;

public class Proxy implements Rent{

    private Host host;

    public Proxy() {
    }

    public Proxy(Host host) {
        this.host = host;
    }

    public void rent() {
        seeHouse();
        host.rent();
        hetong();
        fare();
    }

    //看房
    public void seeHouse(){

        System.out.println("中介带你看房");
    }

    //合同
    public void hetong(){
        System.out.println("签合同");
    }

    //收中介费
    public void fare(){
        System.out.println("收中介费");
    }

}

 

  4,客户

package com.king.demo01;

//客户
public class Client {
    public static void main(String[] args) {
        Host host = new Host();

        //代理
        Proxy proxy = new Proxy(host);
        proxy.rent();
    }
}

 

  代理模式的好处:

    可以使真实角色的操作更加纯粹!,不用关注一些公共业务!

    公共的业务交给代理角色干!,实现了业务分工!

    公共业务发生扩展的时候,方便集中管理!

  缺点

    一个真实角色只会产生一个代理角色,代码量会翻倍,开发效率会变低

 

1.3,静态代理模式加深理解  

  接口(抽象角色)

package com.king.demo02;

public interface UserService {
    public void add();
    public void delete();
    public void update();
    public void query();

}

  

  真实角色

package com.king.demo02;

//真实对象
public class UserServiceImpl implements UserService {
    public void add() {

        System.out.println("增加一个用户");
    }

    public void delete() {
        System.out.println("删除一个用户");
    }

    public void update() {
        System.out.println("修改一个用户");
    }

    public void query() {
        System.out.println("查询一个用户");
    }
}

 

  代理角色

package com.king.demo02;

public class userServiceProxy implements UserService {
    private UserServiceImpl userService;

    //通过setter进行属性注入符合Spring的ioc实现方法DI的底层
    public void setUserService(UserServiceImpl userService) {
        this.userService = userService;
    }

    public void log(String msg){
        System.out.println("使用了"+msg+"方法");
    }

    public void add() {
        log("add");
        userService.add();
    }

    public void delete() {
        log("del");
        userService.delete();
    }

    public void update() {
        log("update");
        userService.update();
    }

    public void query() {
        log("query");
        userService.query();
    }
}

 

  客户

package com.king.demo02;

//客户
public class Client {
    public static void main(String[] args) {
        UserServiceImpl userService = new UserServiceImpl();
        //先走无参创建对象
        userServiceProxy proxy = new userServiceProxy();
        //再通过set方法,实现属性注入,当然有参也能实现,原因:符合Spring依赖注入的方式
        proxy.setUserService(userService);

        proxy.add();

    }
}

 

小结:使用代理模式的目的就是为了保证业务层代码保持不变,可变性强的操作,再代理层实现

 

二,动态代理模式

  1,动态代理和静态代理的角色一样

  2,动态代理的代理类是动态生成的,不是我们直接写好的!

  3,动态代理的实现分为两大类:基于接口的动态代理,基于类的动态代理

    基于接口-----JDK动态代理【在这里使用这个】

    基于类:cglib

    java字节码实现:javasist

    

  需要了解两个类:Poxy,代理    InvocationHandler,调用处理程序  

 

 

 

 

posted @ 2020-11-03 18:42  凸然猿  阅读(103)  评论(0编辑  收藏  举报