代理模式
- 使用一个代理将对象包装起来,使用该代理来取代原始对象;
- 任何对原始对象的调用要通过代理来调用;
- 代理类和被代理类需要实现同样的接口;
静态代理实例
public class StaticProxyTest {
public static void main(String[] args) {
NikeShoeFactory nikeShoeFactory = new NikeShoeFactory();
ProxyShoeFactory proxyShoeFactory = new ProxyShoeFactory(nikeShoeFactory);
proxyShoeFactory.makeShoes();
}
}
interface ShoeFactory{
void makeShoes();
}
//代理类
class ProxyShoeFactory implements ShoeFactory{
private ShoeFactory shoeFactory;
public ProxyShoeFactory(ShoeFactory shoeFactory) {
this.shoeFactory = shoeFactory;
}
@Override
public void makeShoes() {
System.out.println("Proxy begins...");
shoeFactory.makeShoes();
System.out.println("Proxy ends...");
}
}
//代理类
class NikeShoeFactory implements ShoeFactory{
@Override
public void makeShoes() {
System.out.println("Making nike shoes...");
}
}
动态代理实例
public interface Actor {
void act();
String sing();
}
//被代理类
public class HuaYiActor implements Actor {
@Override
public void act() {
System.out.println("I am acting....");
}
@Override
public String sing() {
return "Lalalalala.....";
}
}
//代理类工厂
public class ProxyFactory {
// 提供静态方法,放回一个代理类的对象
public static Object getProxyInstance(Object object) {
MyInvocationHandler myInvocationHandler =new MyInvocationHandler();
myInvocationHandler.setObject(object);
return Proxy.newProxyInstance(object.getClass().getClassLoader(),
object.getClass().getInterfaces(),
myInvocationHandler);
}
}
public class MyInvocationHandler implements InvocationHandler {
// 需要使用被代理类的对象进行初始化
private Object object;
public void setObject(Object object) {
this.object = object;
}
/**
* 使用代理类的对象调用被代理类的方法时,会调用此方法
* @param proxy
* @param method 代理类的方法,也就是需要被代理类执行的方法
* @param args 代理类方法的参数
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(object, args);
}
}
public class ProxyTest {
public static void main(String[] args) {
HuaYiActor actor = new HuaYiActor();
Actor proxyInstance = (Actor) ProxyFactory.getProxyInstance(actor);
actor.act();
String sing = actor.sing();
System.out.println(sing);
//I am acting....
//Lalalalala.....
}
}
网友评论