代理模式
定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
组成:
抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
类图:
静态代理与动态代理
静态代理在编译时期确定下来,动态代理是在运行时生成的一个代理对象。如果代理的真实对象比较多,采用静态代理会造成代理类成倍增加,如果采用动态代理则可以避免这种情况。但是,动态代理是通过反射调用。
静态代理代码实现:
ISubject接口
public interface ISubject {
public void request();
}
RealSubject(真实的代理类)
public class RealSubject implements ISubject {
@Override
public void request() {
Log.e("zhang", "RealSubject request ");
}
}
ProxySubject(代理类)
public class ProxySubject implements ISubject {
private ISubject subject;
public ProxySubject(ISubject subject) {
this.subject = subject;
}
@Override
public void request() {
if (subject != null) {
Log.e("zhang", "ProxySubject before ");
subject.request();
Log.e("zhang", "ProxySubject after ");
}
}
}
程序入口MainActivity
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ISubject subject = new RealSubject();
ProxySubject proxy = new ProxySubject(subject);
proxy.request();
}
}
打印结果:
ProxySubject before
RealSubject request
ProxySubject after
动态代理类图
动态代理代码实现:
ISubject接口
public interface ISubject {
public void request();
}
RealSubject
public class RealSubject implements ISubject {
@Override
public void request() {
Log.e("zhang", "RealSubject request ");
}
}
Proxy(代理类实现InvocationHandler接口)
public class Proxy implements InvocationHandler {
private Object subject;
public Proxy(Object object) {
this.subject = object;
}
@Override
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
Log.e("zhang", "动态代理");
return method.invoke(subject, objects);
}
}
程序入口:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ISubject subject = new RealSubject();
InvocationHandler handler = new Proxy(subject);
subject = (ISubject) java.lang.reflect.Proxy.newProxyInstance(handler.getClass().getClassLoader(), subject.getClass().getInterfaces(), handler);
subject.request();
}
}
打印结果:
动态代理
RealSubject request