代理模式
代理就相当于 中介 买房子的找中介 买房子的找中介 买房子的卖房子的不直接接触,中介可以在代理中添加自己的服务
静态代理
就是代理类中的 代理对象是明确的类
缺点:一个代理对象 一个代理类
优点:速度比动态代理快
接口
public interface FoodFactory {
void payFood(int count);
}
接口实现
public class ImplFood implements FoodFactory {
@Override
public void payFood(int count) {
System.out.println("购买了"+count+"份食物");
}
}
静态代理
public class StaticProxy {
private FoodFactory foodFactory;
public FoodFactory getFoodFactory() {
return foodFactory;
}
public void setFoodFactory(FoodFactory foodFactory) {
this.foodFactory = foodFactory;
}
//方法增强
public void payFoods(int count){
before();
foodFactory.payFood(count);
after();
}
private void before(){
System.out.println("您好!");
}
private void after(){
System.out.println("再见欢迎再来!");
}
}
运行
public static void main(String[] args) {
ImplFood food = new ImplFood();
StaticProxy proxy = new StaticProxy();
proxy.setFoodFactory(food);
proxy.payFoods(10);
}
结果
您好!
购买了10份食物
再见欢迎再来!
动态代理
就是代理类中 的代理对象 是未知的,需要通过调用时指定类,需要Java反射
缺点:需要反射 性能略有影响
优点:一个动态代理类 可以解决多个静态代理的问题,避免重复
动态代理类 要实现InvocationHandler
public class DynamicProxy implements InvocationHandler {
private Object obj;
public Object getProxy(Object obj){
this.obj = obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//方法增强
before();
Object o = method.invoke(obj,args);
after();
return o;
}
private void before(){
System.out.println("您好!");
}
private void after(){
System.out.println("再见欢迎再来!");
}
}
运行
public static void main(String[] args) {
DynamicProxy proxy = new DynamicProxy();
FoodFactory df = (FoodFactory) proxy.getProxy(new ImplFood());
df.payFood(10);
GoodsFactory dg = (GoodsFactory) proxy.getProxy(new ImplGoods());
dg.payGoods("小明");
dg.payGoodsCount(5);
}
结果
您好!
购买了10份食物
再见欢迎再来!
您好!
小明购买了商品
再见欢迎再来!
您好!
5件商品
再见欢迎再来!