- 先来了解一下代理模式
假设有这样一个场景, 你的公司是一家软件司, 你是一位程序设计员。 客户带着需求去找公司显然不会直接和你谈, 而是去找商务谈, 此时客户会认为商务就代表了公司。如下图:
显然客户是通过商务去访问码农, 那么商务存在的意义在于什么呢? 商务可以进行谈判, 如在项目启动前对价格的谈判, 交付时间等等一系列的操作, 这些都不用码农来亲自处理。 因此代理的作用显而易见, 就是在真实对象被访问之前或之后进行一系列的操作, 在这个栗子里商务控制了客户对码农的访问, 所以商务与码农就是代理与被代理的关系, 此时的客户为调用者, 商务是代理对象, 而码农是真实的对象, 而这个代理对象需要和真实对象建立代理关系, 所以代理可以分为两个步骤:
- 代理对象和真实对象建立代理关系
- 实现代理对象的代理逻辑方法
- 代理模式的代码实现
包结构如图:
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();
}
}
- 程序运行结果
88~