11-静态代理分析

 

静态代理

角色分析

项目地址

  • 抽象功能:用接口或抽象类解决

    package com.ajream.demo01;
    
    public interface Rent {
        public void rent();
    }
    
    
  • 真实角色:被代理角色,比如房东

    package com.ajream.demo01;
    
    public class Host implements Rent{
        @Override
        public void rent() {
            System.out.println("房东出租了房子");
        }
    }
    
    
  • 代理角色:代理真实角色,一般会有些附属操作

    package com.ajream.demo01;
    
    public class Proxy implements Rent{
    
        Host host = new Host();    // 代理真实角色
    
        public Proxy() {
        }
    
        public Proxy(Host host) {
            this.host = host;
        }
    
    //  中介帮房东租房子,但中介还会有一些附属操作
        public void rent() {
            host.rent();
            seeHouse();
            qianHeTong();
        }
    
        //中介的附属操作
        public void seeHouse(){
            System.out.println("中介带你看房子。。。");
        }
    
        public void qianHeTong(){
            System.out.println("签合同。。。");
        }
    }
    
    
  • 客户:访问代理对象的人

    package com.ajream.demo01;
    
    import org.junit.Test;
    
    public class Client {
    
        @Test
        public void test(){
    //        找房东租房子
            Host host = new Host();
    
    
    //        客户要租入房子,所以把房东丢给中介,让中介帮忙
            Proxy p = new Proxy(host);
            p.rent();
        }
    
    }
    
    

代理模式好处:

  1. 角色操作更加纯粹,不用取关注一些公共业务
  2. 公共业务交给代理角色,实现业务分工
  3. 公共业务发生扩展时,方便集中管理

缺点:

  1. 一个真实角色会产生一个代理角色,代码量翻倍

代理模式实现业务

项目地址

用代理模式为业务添加日志打印功能

业务接口

package com.ajream.demo02;

//业务接口
public interface UserService {
    void add();
    void delete();
    void update();
    void query();
}

业务实现类(实现增删改查功能)

package com.ajream.demo02;

//业务实现
public class UserServiceImpl implements UserService {
    @Override
    public void add() {
        System.out.println("增加一个用户");
    }

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

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

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

【重点】业务代理类(添加日志打印功能)

package com.ajream.demo02;

public class UserServiceProxy implements UserService{

    UserServiceImpl userService;

    public UserServiceProxy() {
    }

    public void setUserService(UserServiceImpl userService) {
        this.userService = userService;
    }

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

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

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

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

    //代理的额外操作,打印日志
    public void log(String msg){
        System.out.println("使用了" + msg + "方法" );
    }
}

客户

package com.ajream.demo02;

import org.junit.Test;

public class Client {
    @Test
    public void test1(){
        UserServiceImpl userService = new UserServiceImpl();

        UserServiceProxy proxy = new UserServiceProxy();
        proxy.setUserService(userService);

        proxy.add();
    }
}

posted @ 2021-08-01 23:16  aJream  阅读(26)  评论(0编辑  收藏  举报