9、代理模式(Proxy Pattern)

代理模式指为对象提供一种通过代理的方式来访问并控制该对象行为的方法。在客户端不适合或者不能够直接引用一个对象时,可以通过该对象的代理对象来实现对该对象的访问,可以将该代理对象理解为客户端和目标对象之间的中介者。

在代理模式下有两种角色,一种是被代理者,一种是代理(Proxy),在被代理者需要做一项工作时,不用自己做,而是交给代理做。比如企业在招人时,不用自己去市场上找,可以通过猎头公司去找,代理有候选人池,可根据企业的需求筛选出合适的候选人返回给企业。UML设计图如下:

9、代理模式(Proxy Pattern)_第1张图片

1)定义Company接口及其实现类HR:

public interface Company {
    void findWorker(String title);
}
@Slf4j
public class HR implements Company {
    @Override
    public void findWorker(String title) {
        log.info("I need a worker, title is " + title);
    }
}

2)定义Proxy:

package cn.jaa.proxy_pattern;

import lombok.extern.slf4j.Slf4j;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author: Jaa
 * @Description:
 * @Date 2023/11/30
 */
@Slf4j
public class Proxy implements Company {

    private HR hr;

    public Proxy() {
        this.hr = new HR();
    }

    @Override
    public void findWorker(String title) {
        hr.findWorker(title);
        // 通过猎头找候选人
        String worker = getWorker(title);
        log.info("find a worker by proxy, name is " + worker);
    }

    private String getWorker(String title) {
        Map workerList = new HashMap<>() {
            {
                put("Java", "张三");
                put("Go", "李四");
                put("Python", "王五");
            }
        };
        return workerList.get(title);
    }
}

 3)测试代理模式:

package cn.jaa.proxy_pattern;

/**
 * @Author: Jaa
 * @Description:
 * @Date 2023/11/30
 */
public class ProxyDemoTest {

    public static void main(String[] args) {
        Company proxy = new Proxy();
        proxy.findWorker("Java");
    }
}

运行结果:

你可能感兴趣的:(23种设计模式,代理模式,设计模式)