(五)代理模式(结构型模式)
代理模式定义
代理模式就是为一个对象(被代理对象)提供一个代理对象,并且通过代理对象控制对原来被代理对象的访问。可以简单理解为通过代理对象访问目标对象。这样做最大的好处就是可以在目标对象实现的基础上,增强额外的功能,起到扩展目标对象的效果。
代理模式优缺点
优点
- 职责清晰,具体的实现对象只需要关注实际的业务逻辑,不关心其他非本职事务,可以通过后期的代理完成一件事务;
- 扩展性好,可以在不修改原实现对象的基础上进行功能扩展;
- 代理模式将客户端和对象进行分离,一定程度上降低了耦合性;
缺点
- 代理模式会增加系统设计中的类数量,增加了系统的复杂度;
- 在客户端和目标用户之间新增一个代理对象,会造成请求处理速度慢;
代理模式类图
静态代理
动态代理
代理模式适用场景
- 在非入侵情况下进行某个实现类的方法增强可以使用代理模式;
- Spring的AOP使用了代理模式;
代理模式实现方式
功能类接口与实现类
public interface LawyerService {
void caseResearch();
void quote();
}
public class LawyerServiceImpl implements LawyerService{
@Override
public void caseResearch() {System.out.println("进行案件调研");}
@Override
public void quote() {System.out.println("进行报价");}
}
静态代理类
public class LawyerProxy {
private Object lawyerService;
public LawyerProxy(Object lawyerService) {
this.lawyerService = lawyerService;
}
public void caseResearch() {
System.out.println("调用代理类");
lawyerService.caseResearch();
System.out.println("代理结束");
}
}
动态代理类
public class LawyerProxy {
public static Object getLawyerProxy(Object lawyerService) {
return Proxy.newProxyInstance(lawyerService.getClass().getClassLoader(),
lawyerService.getClass().getInterfaces(),
(Object proxy, Method method, Object[] args) ->{
System.out.println("代理前处理");
// 通过反射进行原方法执行
Object invoke = method.invoke(lawyerService, args);
System.out.println("代理后处理");
return invoke;
});
}
}
使用者
public class Main {
public static void main(String[] args) {
// 静态代理调用
// LawyerProxy lawyerProxy = new LawyerProxy(new LawyerServiceImpl());
// lawyerProxy.caseResearch();
// 动态代理调用
LawyerService lawyerProxy = (LawyerService) LawyerProxy.getLawyerProxy(new LawyerServiceImpl());
lawyerProxy.caseResearch();
}
}
(六)适配器模式(结构型模式)
适配器模式定义
适配器模式就是将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
适配器模式优缺点
优点
- 提高类的复用性,原类可以继续使用,新类通过适配进行工作;
- 提高了系统的灵活性,可以灵活的进行原系统的功能适配;
缺点
- 适配器编写过程中会增加系统的复杂程度;
- 降低代码的可读性,过多使用适配器会使系统变得凌乱;
适配器模式类图
适配器模式适用场景
- 在已有系统中进行系统扩展,新的扩展需求的接口或者类不满足原系统的接口/类,为减少系统改动,新增适配器进行相关适配。
适配器模式实现方式
原对象与新对象
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private String name;
private Integer age;
private String mail;
private String address;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ExternalUser {
private String externalName;
private String externalAge;
private String externalMail;
}
适配器和使用者
public class UserAdapter {
public static User getProvider(ExternalUser externalUser){
// 将外部对象转换为内部对象
User user = new User();
user.setName(externalUser.getExternalName());
user.setAge(Integer.parseInt(externalUser.getExternalAge()));
user.setMail(externalUser.getExternalMail());
return user;
}
}
public class Main {
public static void main(String[] args) {
ExternalUser ll = new ExternalUser("LL", "12", "[email protected]");
User provider = UserAdapter.getProvider(ll);
System.out.println(provider);
}
}
标签:对象,适配器,代理,模式,public,学习,设计模式,lawyerService,纪要
From: https://blog.csdn.net/junlouyu/article/details/136849394