代理模式(AOP的底层实现)
1.为什么要学习代理模式?
代理模式是AOP的底层。
2.代理模式可以分为?
静态代理
动态代理
3.什么是代理模式?怎么理解?
在软件系统中,代理机制的实现有现成的设计模式支持,就叫代理模式。通常有四种角色。
抽象角色:一般会使用接口或抽象类解决。
真实角色:被代理的角色。
代理角色:代理真实角色的角色,一般会做一些附属操作。
客户角色:访问代理对象的人。
4.代码步骤
4.1接口
public interface Rent {
public void Rent();
}
4.2真实角色
//房东
public class Host implements Rent{
public void Rent() {
System.out.println("房东出租房屋");
}
}
4.3代理角色
public class Proxy implements Rent{
private Host host;
public Proxy(){
}
public Proxy(Host host){
this.host=host;
}
@Override
public void Rent() {
host.Rent();
}
//看房
public void seeHose(){
System.out.println("中介带你看房");
}
//收中介费
public void fare(){
System.out.println("收中介费");
}
//签租赁合同
public void HeTong(){
System.out.println("签租赁合同");
}
}
4.4客户端访问代理角色
public class Client {
public static void main(String[] args) {
Host host = new Host();
Proxy proxy = new Proxy(host);
proxy.Rent();
}
}
5.代理模式的优缺点
5.1优点:
(1)可以使真实角色的操作更加纯粹,不用去管理其他的公共业务。
(2)公共业务交给了代理角色,实现了业务的分工。
(3)公共业务发生扩展的时候,方便集中管理。
5.2缺点
一个真实角色就会产生一个代理角色,代码量会翻倍,开发效率会变低。
6.聊聊AOP
public interface User {
public void add();
public void delete();
public void update();
public void query();
public class UserServiceImpl implements User{
@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("查找用户");
}
}
public class UserServicePoxy implements User{
UserServiceImpl UserService;
public void setUserService(UserServiceImpl userService) {
UserService = userService;
}
@Override
public void add() {
log("add");
UserService.add();
}
@Override
public void delete() {
log("delete");
UserService.delete();
}
@Override
public void update() {
log("update");
UserService.update();
}
@Override
public void query() {
log("query");
UserService.query();
}
//日志方法
public void log(String msg){
System.out.println("日志"+":"+"使用了"+msg+"方法");
}
}
public class Client {
public static void main(String[] args) {
UserServiceImpl UserService = new UserServiceImpl();
UserServicePoxy proxy = new UserServicePoxy();
proxy.setUserService(UserService);
proxy.add();
proxy.delete();
proxy.update();
proxy.query();
}
}