设计模式-代理模式

54 阅读2分钟

1、代理模式简介

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

在现实生活中也能看到代理模式的身影,比如企业会把五险一金业务交给第三方人力资源公司去做,因为人力资源公司对五险一金业务更加熟悉。

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

2、代理模式实现

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

 public interface Company {
     void findWoker(String title);
 }
 public class HR implements Company {
 ​
     @Override
     public void findWoker(String title) {
         System.out.println("i neet find a worker,title is :"+title);
     }
 }

以上代码定义了一个名为Company的接口,在该接口中定义了方法findWorker(),然后定义了其实现类HR,最后实现了findWorker()以负责公司的具体招聘工作。

(2)定义Proxy

 import java.util.HashMap;
 import java.util.Map;
 ​
 public class Proxy implements Company {
     private HR hr;
 ​
     public Proxy() {
         super();
         this.hr=new HR();
     }
 ​
     //需要代理的方法
     @Override
     public void findWoker(String title) {
         hr.findWoker(title);
         //通过猎头找候选人
         String worker = getWorker(title);
         System.out.println("find a worker by proxy,worker name is :"+worker);
     }
 ​
     private String getWorker(String title){
         Map<String,String> workerList=new HashMap<String,String>(){
             {
                 put("Java","张三");
                 put("Python","李四");
                 put("Php","王五");
             }
         };
         return workerList.get(title);
     }
 }

以上代码定义了一个代理类Proxy,用于帮助企业寻找合适的候选人。其中Proxy继承了Company并持有HR对象,在其HR发出找人指令(findWorker)之后,由代理完成具体的寻找候选人工作并将找到的候选人提供给公司。

(3)使用代理模式

 //使用代理模式
 public static void main(String[] args) {
     Company company=new Proxy();
     company.findWoker("Java");
 }

在使用代理模式时定义一个代理对象并调用其代理的方法即可,运行结果如下: