设计模式学习纪要(三)

(五)代理模式(结构型模式)

代理模式定义

代理模式就是为一个对象(被代理对象)提供一个代理对象,并且通过代理对象控制对原来被代理对象的访问。可以简单理解为通过代理对象访问目标对象。这样做最大的好处就是可以在目标对象实现的基础上,增强额外的功能,起到扩展目标对象的效果。

代理模式优缺点
优点
  1. 职责清晰,具体的实现对象只需要关注实际的业务逻辑,不关心其他非本职事务,可以通过后期的代理完成一件事务;
  2. 扩展性好,可以在不修改原实现对象的基础上进行功能扩展;
  3. 代理模式将客户端和对象进行分离,一定程度上降低了耦合性;
缺点
  1. 代理模式会增加系统设计中的类数量,增加了系统的复杂度;
  2. 在客户端和目标用户之间新增一个代理对象,会造成请求处理速度慢;
代理模式类图
静态代理

在这里插入图片描述

动态代理

在这里插入图片描述

代理模式适用场景
  1. 在非入侵情况下进行某个实现类的方法增强可以使用代理模式;
  2. 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();
    }
}

(六)适配器模式(结构型模式)

适配器模式定义

适配器模式就是将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

适配器模式优缺点
优点
  1. 提高类的复用性,原类可以继续使用,新类通过适配进行工作;
  2. 提高了系统的灵活性,可以灵活的进行原系统的功能适配;
缺点
  1. 适配器编写过程中会增加系统的复杂程度;
  2. 降低代码的可读性,过多使用适配器会使系统变得凌乱;
适配器模式类图

在这里插入图片描述

适配器模式适用场景
  1. 在已有系统中进行系统扩展,新的扩展需求的接口或者类不满足原系统的接口/类,为减少系统改动,新增适配器进行相关适配。
适配器模式实现方式

原对象与新对象

@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", "123@qq.com");
        User provider = UserAdapter.getProvider(ll);
        System.out.println(provider);
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值