之前说了aop有四种实现方式,其中最不推荐的就是动态代理实现,因为它浸入代码强,不利于维护,但是也要知道,因为其他实现方式里面的原理也用到了动态代理,只是封装更好 用起来更简单
比如一个app要收藏或者关注必须是用户已经登陆情况,除非是app可以是游客的情况下登陆也能收藏或者关注,这是另话了,
我定义了一个用户行为接口 有收藏和关注方法
public interface IUser {
void save();
void collect(int id);
void attention(int id);
}
上面是代理的实现
public class MainActivity extends AppCompatActivity implements IUser {
private IUser iUser;
private Button btnCollect,btnAttention;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iUser = (IUser) Proxy.newProxyInstance(IUser.class.getClassLoader(),
new Class[]{IUser.class}, new UserHandler(this));
btnCollect = findViewById(R.id.activity_main_btn_collect);
btnAttention = findViewById(R.id.activity_main_btn_attention);
btnCollect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
collect();
}
});
btnAttention.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
attention();
}
});
}
private void attention() {
iUser.attention(100);
}
private void collect() {
iUser.collect(100);
}
@Override
public void save() {
}
@Override
public void collect(int id) {
Log.e("UserHandler","用户收藏");
}
@Override
public void attention(int id) {
Log.e("UserHandler","用户关注");
}
}
UserHandler.java
public class UserHandler implements InvocationHandler {
private static final String TAG = "UserHandler";
private IUser iUser;
public UserHandler(IUser iUser) {
this.iUser = iUser;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (iUser != null) {
if(!isLogin()){
Log.e(TAG,"正在登录...");
}
//模拟用户登录行为
Thread.sleep(3000);
Log.e(TAG,"登录成功...");
return method.invoke(iUser, args);
}
return null;
}
private boolean isLogin() {
return false;
}
}
这样用户收藏和关注中的判断用户是否登陆,就直接放在动态代理做了,这样如果登陆有啥需求变动的话,就在一处改动就行,如果需要在执行收藏前后都加点其他需求的话,我们只要添加一个接口就行
public interface Operation {
void before();
void after();
}
在构造函数中传递过去
public class UserHandler implements InvocationHandler {
private static final String TAG = "UserHandler";
private IUser iUser;
private Operation operation;
public UserHandler(IUser iUser, Operation operation) {
this.iUser = iUser;
this.operation = operation;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (iUser != null) {
operation.before();
//模拟用户登录行为
Thread.sleep(3000);
Object object = method.invoke(iUser, args);
operation.after();
return object;
}
return null;
}
}
这样为后面学习aop的第三种方式 理解有帮助.