百度百科
代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
组成:
- 抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
- 代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
- 真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
抽象角色
public interface GiveGift {
void giveDolls();
void giveFlowers();
void giveChocolate();
}
真实角色
public class Pursuit implements GiveGift{
SchoolGird mm;
public Pursuit(SchoolGird mm) {
this.mm = mm;
}
public void giveDolls(){
System.out.println("送洋娃娃");
}
public void giveFlowers(){
System.out.println("送洋花");
}
public void giveChocolate(){
System.out.println("送洋巧克力");
}
}
代理角色
public class Proxy implements GiveGift{
Pursuit pursuit; //持有一个被代理角色对象的引用
public Proxy(SchoolGird schoolGird) {
this.pursuit = new Pursuit(schoolGird);
}
//代理角色中,可以添加新方法
public void lookMovies() {
System.out.println("看电影");
}
public void giveDolls(){
System.out.println("送洋娃娃");
}
public void giveFlowers(){
System.out.println("送洋花");
}
public void giveChocolate(){
System.out.println("送洋巧克力");
}
}
客户端代码
public class Main {
public static void main(String[] args) {
SchoolGird schoolGird = new SchoolGird();
schoolGird.setName("文静");
Proxy proxy = new Proxy(schoolGird);
proxy.giveChocolate();
proxy.giveDolls();
proxy.giveFlowers();
proxy.lookMovies();
}
}
jdk代理、实现InvocationHandler接口
public class DynamicProxyTest {
interface Ihello {
void sayHello();
}
static class Hello implements Ihello {
@Override
public void sayHello() {
System.out.println("hello world!");
}
}
static class DynamicProxy implements InvocationHandler {
Object originalObj; //要被代理类的一个引用
Object bind(Object originalObj) {
this.originalObj = originalObj;
return Proxy.newProxyInstance(originalObj.getClass().getClassLoader(),
originalObj.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("welcome"); //在调用实际类之前做的的事
return method.invoke(originalObj, args);
}
}
public static void main(String[] args) {
Ihello ihello = (Ihello) new DynamicProxy().bind(new Hello());
ihello.sayHello();
}
}