代理模式
代理就相當(dāng)于 中介 買房子的找中介 買房子的找中介 買房子的賣房子的不直接接觸,中介可以在代理中添加自己的服務(wù)
靜態(tài)代理
就是代理類中的 代理對(duì)象是明確的類
缺點(diǎn):一個(gè)代理對(duì)象 一個(gè)代理類
優(yōu)點(diǎn):速度比動(dòng)態(tài)代理快
接口
public interface FoodFactory {
void payFood(int count);
}
接口實(shí)現(xiàn)
public class ImplFood implements FoodFactory {
@Override
public void payFood(int count) {
System.out.println("購買了"+count+"份食物");
}
}
靜態(tài)代理
public class StaticProxy {
private FoodFactory foodFactory;
public FoodFactory getFoodFactory() {
return foodFactory;
}
public void setFoodFactory(FoodFactory foodFactory) {
this.foodFactory = foodFactory;
}
//方法增強(qiáng)
public void payFoods(int count){
before();
foodFactory.payFood(count);
after();
}
private void before(){
System.out.println("您好!");
}
private void after(){
System.out.println("再見歡迎再來!");
}
}
運(yùn)行
public static void main(String[] args) {
ImplFood food = new ImplFood();
StaticProxy proxy = new StaticProxy();
proxy.setFoodFactory(food);
proxy.payFoods(10);
}
結(jié)果
您好!
購買了10份食物
再見歡迎再來!
動(dòng)態(tài)代理
就是代理類中 的代理對(duì)象 是未知的,需要通過調(diào)用時(shí)指定類,需要Java反射
缺點(diǎn):需要反射 性能略有影響
優(yōu)點(diǎn):一個(gè)動(dòng)態(tài)代理類 可以解決多個(gè)靜態(tài)代理的問題,避免重復(fù)
動(dòng)態(tài)代理類 要實(shí)現(xiàn)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 {
//方法增強(qiáng)
before();
Object o = method.invoke(obj,args);
after();
return o;
}
private void before(){
System.out.println("您好!");
}
private void after(){
System.out.println("再見歡迎再來!");
}
}
運(yùn)行
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);
}
結(jié)果
您好!
購買了10份食物
再見歡迎再來!
您好!
小明購買了商品
再見歡迎再來!
您好!
5件商品
再見歡迎再來!