[一天一个设计模式]-[代理模式]
代理模式的设计思想是通过代理的方式避免暴露被代理对象或者说代理不容易被取得的对象.
代理又分为静态代理、动态代理。
- 静态代理是由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。
- 动态代理是在实现阶段不用关心代理类,而在运行阶段才指定哪一个对象。当有一组不同的主题的控制访问一致,如果用静态代理就需要为每个主题创建一个代理类,很多访问控制的冗余代码,动态代理就可以很好的解决这个问题。
代理模式的主要角色如下。
- 抽象主题(Subject)类:通过接口或抽象类声明真实主题和代理对象实现的业务方法。
- 真实主题(Real Subject)类:实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。
- 代理(Proxy)类:提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。
代理模式和适配器模式区别,适配器模式是要改变类型,代理模式保持类型不变
代理模式和装饰器模式区别,装饰器模式是为了增强现有对象,代理模式是为了控制现有对象
举个栗子,买车票不去自己去火车站,而是通过黄牛。
静态代理
interface Buy{
void buy();
}
class LiLi implements Buy{
@Overrride
public void buy(){
sout("buy LiLi's [==]");
}
}
//黄牛代理 LiLi
class YellowCow implement Buy{
Buy buy;
public YellowCow(Buy buy){
buy = buy;
}
@Override
public void buy(){
if( buy instanceof LiLi){
buy.buy();
}
}
}
动态代理
class YellowCow implements InvocationHandler {
Object buy;
public YellowCow(Object buy){
buy = buy;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if( buy instanceof LiLi){
return method.invoke(buy, args);
}
return null;
}
}
main(){
//静态代理
Buy y=new YellowCow(new LiLi());
y.buy();
//动态代理
Buy y=Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Buy.class},new YellowCow(new LiLi()));
y.buy();
}