代理
静态代理
共同接口:一个就够。里面含有所有对象共有的方法真实对象:可以多些,重写接口的方法
代理对象:创建真实对象
可以多建对接共同接口的实现类,但代理对象不要动
代理与工厂的显著不同之处就是代理是实现功能扩展,工厂是制造对象
看例子,卖书的例子,共同接口,批发商
public interface Press {
void sellingBooks();
}
卖书的普通店铺实现接口的方法
//实现类 -真实对象 普通书店
public class PressImpl implements Press{
@Override
public void sellingBooks() {
System.out.println("publishing house sell books");
}
}
卖书的新华店铺实现接口的方法
//实现类 -真实对象 新华书店
public class XinHuaImpl implements Press {
@Override
public void sellingBooks() {
System.out.println("sell Xinhua book");
}
}
最后实例对象,书谱
//实例对象-实现类
public class Bookestore implements Press {
private Press press=null;
public Bookestore(Press press1) {//使用构造方法选择并实现真实对象
this.press =press1;
}
public void sellingBooks() {
discount();
press.sellingBooks();
System.out.println("present discount ticket");
}
public void discount() {
System.out.println("today boss is happy,sell at a discount");
}
}
测试类
public class Test01 {
public static void main(String[] args) {
Press press =new Bookestore(new RiYueImpl());
press.sellingBooks();
}
}
动态代理
如果书店变成超市怎么实现?
明显不是一个书店批发商的共同接口就可以实现的。这时就需要引入动态代理
首先写一个水果的共同接口
public interface Apple {
void sellA();
}
水果我们就卖灵宝苹果,接下来是灵宝苹果的真实对象
public class LingBaoAppleImpl implements Apple {
@Override
public void sellA() {
System.out.println("sell ling bao Apple");
}
}
动态代理与静态最大的区别就在代理对象上,需要对接InvocationHandler(动态代理)接口
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class Supermarket2 implements InvocationHandler{//动态代理invocationHandler-JDK offer
private Object obj=null;
public Supermarket2(Object obj) {
this.obj = obj;
}
private void discout() {
System.out.println("discout");
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
discout();
Object ob=method.invoke(obj, args);
return ob;
}
}
test类的写法需要引入proxy(代理)的类
public class Test02 {
public static void main(String[] args) {
Supermarket s=new Supermarket(new LingBaoAppleImpl());
Apple xhi=(Apple) Proxy.newProxyInstance(s.getClass().getClassLoader(), new Class[] {Apple.class}, s);
xhi.sellA();//proxy代理人
}
}