一、静态代理的角色分析
抽象角色:一般使用接口或者抽象类来实现。
真实角色:被代理的角色。
代理角色:代理真实角色。代理真实角色后一般会做一些附属操作。
客户:使用代理角色来进行一些操作。
二、代码实现
模拟顾客找中介租房:
Rent.java --- 抽象角色:
public
interface
Rent {
public
void
rent();
}
Host.java --- 真实角色:
public
class
Host
implements
Rent {
public
void
rent() {
System.
out
.println(
"房屋出租"
);
}
}
Proxy.java --- 代理角色:
public
class
Proxy
implements
Rent {
private
Host
host
;
public
Proxy() {
super
();
}
public
Proxy(Host
host
) {
super
();
this
.
host
=
host
;
}
public
void
setHost(Host
host
) {
this
.
host
=
host
;
}
//租房
public
void
rent() {
seeHouse();
host
.rent();
fare();
}
//看房
private
void
seeHouse() {
System.
out
.println(
"带房客看房"
);
}
//收中介费
private
void
fare() {
System.
out
.println(
"收取中介费"
);
}
}
Client.java --- 客户:
public
class
Client {
public
static
void
main(String[]
args
) {
Host
host
=
new
Host();
Proxy
proxy
=
new
Proxy(
host
);
proxy
.rent();
}
}
三、使用静态代理的优缺点
优点:
使得真实角色处理的业务更加纯粹,不再去关注一些公共的事情。
公共的业务由代理来完成 --- 实现了业务的分工。
公共业务发生扩展时变得更加集中和方便。
|
缺点:
类多了 --- 多了代理类。工作量变大了。开发效率降低了。 |
为了弥补缺点,就出现了动态代理。 |
四、使用静态代理前后对比
以service为例:
public
interface
UserService {
public
void
add();
public
void
update();
public
void
delete();
public
void
search();
}
不使用:
public
class
UserServiceImpl
implements
UserService {
public
void
add() {
log(
"add"
);
System.
out
.println(
"增加用户"
);
}
public
void
update() {
log(
"update"
);
System.
out
.println(
"修改用户"
);
}
public
void
delete() {
log(
"delete"
);
System.
out
.println(
"删除用户"
);
}
public
void
search() {
log(
"search"
);
System.
out
.println(
"查询用户"
);
}
public
void
log(String
methodName
) {
System.
out
.println(
"执行"
+
methodName
+
"方法"
);
}
}
使用:
public
class
UserServiceImpl
implements
UserService {
public
void
add() {
System.
out
.println(
"增加用户"
);
}
public
void
update() {
System.
out
.println(
"修改用户"
);
}
public
void
delete() {
System.
out
.println(
"删除用户"
);
}
public
void
search() {
System.
out
.println(
"查询用户"
);
}
}
public
class
UserServiceProxy
implements
UserService {
private
UserService
userService
;
public
void
add() {
log(
"add"
);
userService
.add();
}
public
void
update() {
log(
"update"
);
userService
.update();
}
public
void
delete() {
log(
"delete"
);
userService
.delete();
}
public
void
search() {
log(
"search"
);
userService
.search();
}
public
void
log(String
methodName
) {
System.
out
.println(
"执行"
+
methodName
+
"方法"
);
}
}
每写一个service就要编写对应的proxy。 |