spring 之 静态代理

1. 代理: 中介

2. 通过程序来实现租房功能。分析下在租房的过程中,有哪些对象:

  • 房东
  • 中介
  • 房客

  中介代理房东进行租房的功能,所以中介和房东具有相同的功能。为了保证中介和房东具有相同的功能,那么中介和房东需要实现相同的接口。

  • 抽象的角色。

代码的实现:Rent.java

/**
 * 
 * 租房接口
 */
public interface Rent {
    //租房
    public void rent();
}

Host.java

/**
 * 
 * @author siggy
 * @version v.10 
 */
public class Host implements Rent{
    @Override
    public void rent() {
        System.out.println("房东租房");
    }
}

Proxy.java

/**
 * 中介
 */
public class Proxy implements Rent{
    private Host host;
    public Proxy(Host host) {
        super();
        this.host = host;
    }
    @Override
    public void rent() {
        fare();
        host.rent();
        maintance();
    }
    private void fare(){
        System.out.println("收取中介费");
    }
    private void maintance(){
        System.out.println("维护");
    }
}

Client.java

public class Client {
    public static void main(String[] args) {
        Host host = new Host();
        Proxy proxy = new Proxy(host);
        proxy.rent();
    }
}

以上代码就是静态代理的实现。通过上述案例可以知道:

3. 静态代理是由4哥角色组成的:

  • 抽象角色
  • 真实角色
  • 代理角色
  • 调用角色

类图:

4. 将静态代理应用到项目中:

公共的业务:Log.java

public class Log {
    public static void log() {
        System.out.println("日志:类,方法, 参数");
    }
}

UserService.java

public interface UserService {
    public void save();
    public void update();
    public void delete();
    public void get();
}

UserServiceImpl.java

public class UserServiceImpl implements UserService{
    /**
     * 在每次实现业务方法时 需要增加一些公共的功能。
     * 如:日志,缓存,安全检查,事务等
     */
    public void save() {
        System.out.println("保存用户");
    }

    @Override
    public void update() {
        System.out.println("更新用户");
    }

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

    @Override
    public void get() {
        System.out.println("获取用户");
    }

}

UserServiceImplProxy.java

public class UserServiceImplProxy implements UserService{
    private UserService userService;
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
    @Override
    public void save() {
        //加入公共业务
        Log.log();
        userService.save();
    }

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

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

    @Override
    public void get() {
        Log.log();
        userService.get();
    }

}

5. 通过上述案例可知,静态代理:

  优点:  

  • 将公共业务和真实业务分离,实现解耦动作。
  • 方便了分工,做公共业务的人,专门处理公共业务,做领域业务的人做领域业务。利于维护

  缺点:代码量增加,业务更复杂。

  

  

原文地址:https://www.cnblogs.com/forever2h/p/6744197.html