代理模式:静态代理的理解(用简单例子)

代理模式

静态代理

代码实现:

  • 抽象角色 :一般会使用接口或者抽象类(例如租房)

  • 真实角色:被代理的角色(例如房东)

  • 代理角色:租房中介,代理房东租房

  • 客户:调用代理的人,也就是想要租房的人

租房的抽象行为用接口实现
public interface rent {
    public void rent();
}
​
房东类并实现接口类 因为他想要出租
public class Host implements rent{
    @Override
    public void rent() {
        System.out.println("出租房子");
    }
}
​
代理类 中介帮助房东实现出租 同样需要实现接口
public class Proxy implements rent{
    Host host ;//不写死的原因是因为要代理各种房东
    public void setHost(Host host) //通过set方法实例化房东
    {
        this.host=host;
    }
​
    @Override
    public void rent() {
        host.rent();
    }
​
}
客户类 调用代理对象 我要租房
public class Client {
    public static void main(String[] args) {
        Host host =new Host(); //这里可以用多态 来实例化不同的房东
        Proxy proxy = new Proxy();
        proxy.setHost(host); //这样可以通过传入不同房东 来实现不同的代理租房
        host.rent();
    }
}

静态代理的理解

例如公司有增删改查功能,需要在增删改查的每个方法中加个日志功能,
OOP有个原则叫尽量不删改原有的代码
准备一个接口增删改查
public interface UserService {
    public void add();
    public void update();
    public void delete();
    public void query();
}
准备一个实现类
public class UserServiceImpl implements UserService {
    @Override
    public void add() {
        System.out.println("add");
    }
​
    @Override
    public void update() {
        System.out.println("update");
    }
​
    @Override
    public void delete() {
        System.out.println("delete");
    }
​
    @Override
    public void query() {
        System.out.println("query");
    }
}

准备一个代理类 在里面调用实现类 并且实现接口 在里面写一个日志方法

public class UserServiceProxy implements UserService {
    UserServiceImpl userService;
​
    public void setUserService(UserServiceImpl userService) {
        this.userService = userService;
    }
​
    @Override
    public void add() {
        log("add1");
        userService.add();
    }
​
    @Override
    public void update() {
        log("update");
        userService.update();
    }
​
    @Override
    public void delete() {
        log("delete");
        userService.delete();
    }
​
    @Override
    public void query() {
        log("query");
        userService.query();
    }
    public void log(String msg)
    {
        System.out.println(msg);
    }
}
准备一个Cilent类 来调用代理类
public class Client {
    public static void main(String[] args) {
       UserServiceProxy userServiceProxy = new UserServiceProxy();
       UserServiceImpl userService = new UserServiceImpl();
​
       userServiceProxy.setUserService(userService);
       userServiceProxy.add();
    }
}

静态代理的优点:

  1. 客户不用关注公共业务

  2. 公共业务交给代理角色,实现业务分工

  3. 公共业务发生扩展时,方便集中管理

静态代理的缺点

一个真实角色就会产生一个代理角色;使代码量翻倍,开发效率变低,但实现了解耦

你可能感兴趣的:(java,代理模式,开发语言)