代理模式
代理模式可以为其他对象提供一种代理(Proxy)以控制对这个对象的访问。
所谓代理,是指具有与代理元(被代理的对象)具有相同的接口的类,客户端必须通过代理与被代理的目标类交互,而代理一般在交互的过程中(交互前后),进行某些特别的处理。
代理模式分三种,普通代理,强制代理,动态代理
普通代理
下面模拟了普通代理,通过代理实例访问被代理对象
package proxy;
public interface BookSell {
public void sell();
}
package proxy;
public class RealBookSell implements BookSell{
@Override
public void sell() {
System.out.println("付款");
}
}
package proxy;
public class BookSellProxy implements BookSell {
RealBookSell rbs = new RealBookSell();
@Override
public void sell() {
discount();
this.rbs.sell();
gift();
}
public void discount(){
System.out.println("打折");
}
public void gift(){
System.out.println("赠送购物券");
}
}
package proxy;
public class Client {
public static void main(String[] args){
BookSellProxy bsp = new BookSellProxy();
bsp.sell();
}
}
强制代理:
同普通代理是相反的,通过被代理实例找到代理实例进行访问,如下代码中,在客户端是先创建被代理对象,然后通过被代理对象得到代理对象进行处理。否则不能处理。
package proxy;
public interface BookSell {
public boolean sell();
}
package proxy;
public class RealBookSell implements BookSell{
BookSell bsProxy = null;
@Override
public boolean sell() {
if(!this.isProxy()){
System.out.println("付款失败,没有指定代理类访问");
return false;
}
System.out.println("付款");
return true;
}
public BookSell getProxy(){
this.bsProxy = new BookSellProxy(this);
return bsProxy;
}
public boolean isProxy(){
if(null != bsProxy){
return true;
}
return false;
}
}
package proxy;
public class BookSellProxy implements BookSell {
BookSell bs = null;
public BookSellProxy(BookSell bs){
this.bs = bs;
}
@Override
public boolean sell() {
discount();
boolean b = this.bs.sell();
if (!b) {
return false;
} else {
gift();
return true;
}
}
public void discount() {
System.out.println("打折");
}
public void gift() {
System.out.println("赠送购物券");
}
}
package proxy;
public class Client {
public static void main(String[] args){
// BookSellProxy bsp = new BookSellProxy();
// bsp.sell();
RealBookSell rbs = new RealBookSell();
BookSell bs = rbs.getProxy();
bs.sell();
}
}
动态代理:
动态代理指实现阶段不知道代理哪个对象,等到运行时才知道代理哪个对象。
上述代理称为静态代理,面向切面编程也就是AOP,核心采用了动态代理机制。
InvocationHandler是JDK提供的动态代理接口,下面将上面的静态代理用动态代理的方式实现下:
package proxy;
public interface BookSell {
public boolean sell();
}
package proxy;
public class RealBookSell implements BookSell{
@Override
public boolean sell() {
System.out.println("付款");
return true;
}
}
package proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class BookSellHandler implements InvocationHandler{
private BookSell bs = null;
public void setTarget(BookSell bs){
this.bs = bs;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
discount();
Object result = method.invoke(bs, args);
if(result instanceof Boolean){
gift();
return result;
}
System.out.println("付款失败");
return result;
}
public void discount(){
System.out.println("打折");
}
public void gift(){
System.out.println("赠送购物券");
}
}