代理模式示例
先看下代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者补鞥呢直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式的组成:
抽象目标:通过接口或者抽象声明真实角色实现的业务方法。
代理角色:实现抽象目标,是真实目标的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
真实目标:实现抽象角色,定义真实目标所要实现的业务逻辑,供代理角色调用。
示例:
1、静态代理
抽象目标
public interface ISendBroadcast {
void send();
}
public class SendBroadcastProxy implements ISendBroadcast {
private static final String TAG = SendBroadcastProxy.class.getSimpleName();
private ISendBroadcast target;
public SendBroadcastProxy(ISendBroadcast target) {
this.target = target;
}
@Override
public void send() {
Log.e(TAG, "send:静态 准备发送");
target.send();
Log.e(TAG, "send:静态 发送广播成功" );
}
}
public class SendBroadcast implements ISendBroadcast {
private static final String TAG = SendBroadcast.class.getSimpleName();
@Override
public void send() {
Log.e(TAG, "send: 使用代理发送广播" );
}
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toast.makeText(this, "静态代理", Toast.LENGTH_SHORT).show();
Log.e(TAG, "staticProxy: 静态代理" );
SendBroadcast broadcast = new SendBroadcast();
SendBroadcastProxy broadcastProxy = new SendBroadcastProxy(broadcast);
broadcastProxy.send();
}
静态代理总结:
可以做到在不修改目标对象功能前提下,对目标功能扩展。不足的是因为代理对象需要与目标实现一样的接口,所以会有很多代理类,类太多。同时一旦接口增加方法,目标对象与代理对象都需要维护。
与静态代理相对应,不需要实现接口。利用JDK的API动态的在内存中构建代理对象。所以动态代理也叫作JDK代理,接口代理。
代理
public class ProxyFactory {
private static final String TAG = ProxyFactory.class.getSimpleName();
private Object target;
public ProxyFactory(Object target) {
this.target = target;
}
public Object getProxyInstance() {
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Log.e(TAG, "invoke:动态 准备发送");
Object invoke = method.invoke(target, args);
Log.e(TAG, "invoke:动态 发送广播成功");
return invoke;
}
}
);
}
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toast.makeText(this, "动态代理", Toast.LENGTH_SHORT).show();
Log.e(TAG, "dynamicProxy: 动态代理" );
SendBroadcast broadcast = new SendBroadcast();
ISendBroadcast instance = (ISendBroadcast) new ProxyFactory(broadcast).getProxyInstance();
Log.e(TAG, "onCreate: 999" + instance.getClass());
instance.send();
}