结构型
代理模式
代理模式是属于结构型的设计模式,指客户端的请求到达真正的对象之前,做一些额外的操作。
静态代理模式
以 AspectJ 为代表。指代理类在编译期生成的,与动态代理相比,效率会很高,但是会生成大量代理类。
动态代理模式
以 SpringAOP 为代表为代表,代理类是动态生成的。虽然会效率会低一点,但是大大简化了代码和开发量。
- JDK 动态代理
- CGlib 动态代理
桥接模式
抽象类:定义一个抽象类,作为系统的一部分。
实现类:定义一个或多个实现类,与抽象类通过聚合(而非继承)关联。
当一个类有两个可以扩展的行为的时候。可以将其中一个行为剥离,以组合方式集成在一起。
比如接口以组合形式集成在抽象类里面。
过滤器模式
用于将对象的筛选过程封装起来,允许使用不同的筛选标准动态地筛选对象。
当需要根据多个不同的条件或标准来筛选一组对象时,过滤器模式提供了一种灵活的方式来定义这些条件,避免在客户端代码中硬编码筛选逻辑。
基本实现
过滤接口
具体过滤实现
组合过滤器
允许过滤器之间组合,形成复杂的过滤逻辑
组合模式
组合模式,它将对象组合成树状的层次结构,用来表示整体-部分的关系,使用户对单个对象和组合对象具有一致的访问性,属于结构性模式。
根节点和叶子结点拥有相同的行为方式。
装饰器模式
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
通过生成装饰器类,来对类进行功能上的扩展。使用了组合的原理,将需要被扩展的类作为对象组合到装饰类中。
再通过装饰类对待扩展的类进行扩展。
待扩展接口类
javapublic interface Robot { void name(); void work(); }
接口实现类
javapublic class AlertRobot implements Robot { @Override public void name() { System.out.println("这是告警机器人"); } @Override public void work() { System.out.println("可以发出告警"); } }
装饰器类
javapublic abstract class DecoratorRobot implements Robot { //接口类采用组合方式注入 protected Robot decoratorRobot; public DecoratorRobot(Robot decoratorRobot) { this.decoratorRobot = decoratorRobot; } @Override public void name() { decoratorRobot.name(); } @Override public void work() { decoratorRobot.work(); } }
装饰类的实现类(扩展功能)
一般使用继承的方式,然后添加方法增加功能。
核心就是不修改原有类,采用新类继承的方式扩展功能。
javapublic class WeatherDecoratorRobot extends DecoratorRobot { public WeatherDecoratorRobot(Robot decoratorRobot) { super(decoratorRobot); } @Override public void name() { super.name(); String nameType = nameType(); System.out.println(nameType); } @Override public void work() { super.work(); //扩展功能,对功能进行装饰 weather(); } private String nameType(){ if(decoratorRobot instanceof AlertRobot){ return "告警"; } if(decoratorRobot instanceof MusicRobot){ return "音乐"; } return "类型不详细"; } private void weather(){ System.out.println("可以进行天气预报"); }
外观模式
外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。
这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。
- SpringMVC的三层架构模式,隐藏内部实现细节,通过接口交互。
- Feign接口调用。
关键代码
- Facade类:提供高层接口,简化客户端与子系统的交互。
- 子系统类:实现具体的业务逻辑,被Facade类调用。
享元模式
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。
通过共享对象来减少创建大量相似对象时的内存消耗。
核心实现
- HashMap:使用哈希表存储已经创建的享元对象,以便快速检索。
使用场景
- Java中的String对象:字符串常量池中已经存在的字符串会被复用。
- 数据库连接池:数据库连接被复用,避免频繁创建和销毁连接。