代理模式 -- 静态代理

March . 04 . 2019
  • 先来了解一下代理模式

假设有这样一个场景, 你的公司是一家软件司, 你是一位程序设计员。 客户带着需求去找公司显然不会直接和你谈, 而是去找商务谈, 此时客户会认为商务就代表了公司。如下图:

2.JPG

    显然客户是通过商务去访问码农, 那么商务存在的意义在于什么呢? 商务可以进行谈判, 如在项目启动前对价格的谈判, 交付时间等等一系列的操作, 这些都不用码农来亲自处理。 因此代理的作用显而易见, 就是在真实对象被访问之前或之后进行一系列的操作, 在这个栗子里商务控制了客户对码农的访问, 所以商务与码农就是代理与被代理的关系, 此时的客户为调用者, 商务是代理对象, 而码农是真实的对象, 而这个代理对象需要和真实对象建立代理关系, 所以代理可以分为两个步骤:

  • 代理对象和真实对象建立代理关系
  • 实现代理对象的代理逻辑方法
  • 代理模式的代码实现

包结构如图:

3.JPG

Negotiation.java

package proxy.state;

// 谈判接口
public interface Negotiation {
    // 谈工资
    void money();
}

Client.java

package proxy.state;

// 客户
public class Client implements Negotiation {

    @Override
    public void money() {
        System.out.println("I will pay you 10000$");
    }
}

Programmer.java

package proxy.state;

// 码农
public class Programmer implements Negotiation {
    @Override
    public void money() {
        System.out.println("No, I need 15000$");      // 码农需要 15000$
    }
}

Agent.java

package proxy.state;

// 代理
public class Agent implements Negotiation{

    Negotiation person;

    public Agent()
    {

    }

    public Agent(Negotiation programmer)
    {
        this.person = programmer;
    }

    @Override
    public void money() {
        this.person.money();      // 代理转达代理对象的要求
    }
}


Test.java

package proxy.state;

// 测试类
public class Test {

    public static void main(String[] args)
    {
        Programmer programmer = new Programmer();   // 码农
        Client client = new Client();               // 客户
        Agent agent = new Agent();                  // 中间商

        agent.person = client;                      // 代理客户的需求
        agent.money();

        agent.person = programmer;                  // 代理码农的需求
        agent.money();
    }
}
  • 程序运行结果

4.JPG

 88~