JavaSE-静态代理

代理模式分类:

  • 静态代理
  • 动态代理

1.1 静态代理

静态代理角色分析

  • 抽象角色: 一般使用接口或者抽象类来实现。
  • 真实角色 : 被代理的角色。
  • 代理角色 : 代理真实角色 ; 代理真实角色后 , 一般会做一些附属的操作 。
  • 客户 : 使用代理角色来进行一些操作 。

1.2 代码示例

Rent接口(抽象角色)

package cn.guardwhy.domain;
// 抽象角色:租房
public interface Rent {
    
    
    public void rent();
}

Landlord

package cn.guardwhy.domain;
// 真实角色: 房东,要出租房子
public class Landlord implements Rent {
    
    
    @Override
    public void rent() {
    
    
        System.out.println("房屋出租!!!");
    }
}

Proxy 即代理角色

package cn.guardwhy.proxy;

import cn.guardwhy.domain.Landlord;
import cn.guardwhy.domain.Rent;

public class Proxy implements Rent {
    
    
    private Landlord landlord;

    public Proxy() {
    
    

    }

    public Proxy(Landlord landlord) {
    
    
        this.landlord = landlord;
    }

    @Override
    // 租房
    public void rent() {
    
    
        // 调用方法
        seeHouse();
        landlord.rent();
        agreement();
        fare();
    }

    // 看房
    public void seeHouse(){
    
    
        System.out.println("带房客看房!!!");
    }
    // 合同
    public void agreement(){
    
    
        System.out.println("签租赁合同...");
    }
    // 收中介费
    public void fare(){
    
    
        System.out.println("收中介费");
    }
}

Client(租客)

package cn.guardwhy.client;

import cn.guardwhy.domain.Landlord;
import cn.guardwhy.proxy.Proxy;

public class Client {
    
    
    public static void main(String[] args) {
    
    
        // 1.房东租房子
        Landlord landlord = new Landlord();
        // 2.代理,中介帮房东租房子
        Proxy proxy = new Proxy(landlord);
        // 3.不需要直接面对房东,直接找中介租房即可
        proxy.rent();
    }
}

执行结果

分析结果

在这个过程中,你直接接触的就是中介,就如同现实生活中的样子,你看不到房东,但是你依旧租到了房东的房子通过代理,这就是所谓的代理模式。

1.3 静态代理特点

优点:

  • 可以使得我们的真实角色更加纯粹 . 不再去关注一些公共的事情 。
  • 公共的业务由代理来完成 . 实现了业务的分工 。
  • 公共业务发生扩展时变得更加集中和方便 。

缺点 :

类多了 , 多了代理类 , 工作量变大了 . 开发效率降低 。

2.1 静态代理再理解

1.抽象角色

package cn.guardwhy.domain;
// 抽象角色,增删改查业务
public interface UserService {
    
    
    void add();
    void delete();
    void update();
    void query();
}

2、真实对象来完成增删改查操作

package cn.guardwhy.domain;
// 真实对象,完成增删改查的操作
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("查询一个用户");
    }
}

3、设置一个代理类来处理日志

package cn.guardwhy.proxy;

import cn.guardwhy.domain.UserService;
import cn.guardwhy.domain.UserServiceImpl;

public class UserServiceProxy implements UserService {
    
    
    private UserServiceImpl userService;

    public UserServiceImpl getUserService() {
    
    
        return userService;
    }

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

    @Override
    public void add() {
    
    
        message("添加方法");
        userService.add();
    }

    @Override
    public void delete() {
    
    
        message("删除方法");
        userService.delete();
    }

    @Override
    public void update() {
    
    
        message("更新方法");
        userService.update();
    }

    @Override
    public void query() {
    
    
        message("查询方法");
        userService.query();
    }

    public void message(String msg){
    
    
        System.out.println("执行了" + msg + "方法!!");
    }
}

4、测试代码

package cn.guardwhy.client;

import cn.guardwhy.domain.UserServiceImpl;
import cn.guardwhy.proxy.UserServiceProxy;

public class Client2 {
    
    
    public static void main(String[] args) {
    
    
        // 1.真实业务
        UserServiceImpl userService = new UserServiceImpl();
        // 2.代理类
        UserServiceProxy proxy = new UserServiceProxy();
        // 3.使用代理类实现日志功能
        proxy.setUserService(userService);
        // 调用方法
        proxy.add();
    }
}

猜你喜欢

转载自blog.csdn.net/hxy1625309592/article/details/115031693