通过具体的实践来说明下代理模式的这两点:
公共事物交给代理角色,实现了业务分工
公共事物发生变化是,方便集中管理
可以写一个例子,想扩展一个功能,而不改变原来的方法,可以使用代理模式
具体实现以下,
写一个可以增删改的接口:
package agent1;
public interface UserService {
public void add();
public void delete();
public void update();
public void query();
}
写一个这些接口的实现类
package agent1;
//实现对象
public class UerServiceImpl implements UserService {
@Override
public void add() {
System.out.println("增加了一个用户");
}
@Override
public void delete() {
System.out.println("删除了一个用户");
}
@Override
public void update() {
System.out.println("更新了一个用户");
}
@Override
public void query() {
System.out.println("查询了一个用户");
}
}
写一个客户端调用
package agent1;
public class Client1 {
public static void main(String[] args) {
UerServiceImpl uerService = new UerServiceImpl();
uerService.add();
/* UerServiceProxy proxy = new UerServiceProxy();
proxy.setUerService(uerService);
proxy.add();*/
}
}
现在增加一个日志功能,而尽量不影响原来的方法
增加一个代理类:
package agent1;
public class UerServiceProxy implements UserService{
UerServiceImpl uerService;
public void setUerService(UerServiceImpl uerService) {
this.uerService = uerService;
}
@Override
public void add() {
log("add");
uerService.add();
}
@Override
public void delete() {
log("delete");
uerService.delete();
}
@Override
public void update() {
log("update");
uerService.update();
}
@Override
public void query() {
log("query");
uerService.query();
}
//日志方法
public void log(String msg) {
System.out.println("[Debug] 使用了" + msg + "方法");
}
}
client端调用变为:
package agent1;
public class Client1 {
public static void main(String[] args) {
UerServiceImpl uerService = new UerServiceImpl();
UerServiceProxy proxy = new UerServiceProxy();
proxy.setUerService(uerService);
proxy.add();
}
}
有人可能有疑问,代理类的实现和原来差不多,为啥要再写一遍,在原来基础上直接加个日志的类不行吗?
这是因为,尽量不要动原来的代码
好了,今天先到这里