意图:为其他对象提供一种代理以控制对这个对象的访问。
何时使用:想在访问一个类时做一些控制。
如何解决:增加中间层。
关键代码:实现与被代理类组合。
优点: 1、职责清晰。 2、高扩展性。 3、智能化
缺点: 1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
//is-a;继承
//is-like-a:实现
//has-a:拥有
// class B{
// A a = new A();
// a.b();
// }
//class B{
// public void b(A a){
//A类对象作为参数
// }
// }
举例说明:
公司类:(创建一个接口)
package com.feisi.company;
public interface Company {
public void getMoney();
}
当事人类:(创建实现接口的实体类。)
package com.feisi.company;
public class Human implements Company {
public void getMoney(){
System.out.println("当事人需要讨债100w");
}
}
代理人类:(当被请求时,使用 Proxy 来获取 Human类的对象)
package com.feisi.company;
public class Proxy implements Company{
Company company;//父类引用
public Proxy(Company company){
this.company = company;//Proxy构造方法
}
public void getMoney(){
company.getMoney();
}
}
测试类:
package com.feisi.company;
public class Test extends Human{
public static void main(String[] args) {
Company company = new Human();
Proxy proxy = new Proxy(company);
proxy.getMoney();
}
}