Skip to content

结构型

design-structural

代理模式

代理模式是属于结构型的设计模式,指客户端的请求到达真正的对象之前,做一些额外的操作。

静态代理模式

以 AspectJ 为代表。指代理类在编译期生成的,与动态代理相比,效率会很高,但是会生成大量代理类。

动态代理模式

以 SpringAOP 为代表为代表,代理类是动态生成的。虽然会效率会低一点,但是大大简化了代码和开发量。

  • JDK 动态代理
  • CGlib 动态代理

桥接模式

抽象类:定义一个抽象类,作为系统的一部分。

实现类:定义一个或多个实现类,与抽象类通过聚合(而非继承)关联。

当一个类有两个可以扩展的行为的时候。可以将其中一个行为剥离,以组合方式集成在一起。

比如接口以组合形式集成在抽象类里面。

过滤器模式

用于将对象的筛选过程封装起来,允许使用不同的筛选标准动态地筛选对象

当需要根据多个不同的条件或标准来筛选一组对象时,过滤器模式提供了一种灵活的方式来定义这些条件,避免在客户端代码中硬编码筛选逻辑

基本实现

  • 过滤接口

  • 具体过滤实现

  • 组合过滤器

    允许过滤器之间组合,形成复杂的过滤逻辑

组合模式

组合模式,它将对象组合成树状的层次结构,用来表示整体-部分的关系,使用户对单个对象和组合对象具有一致的访问性,属于结构性模式。

根节点和叶子结点拥有相同的行为方式。

装饰器模式

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

装饰器模式的 UML 图

通过生成装饰器类,来对类进行功能上的扩展。使用了组合的原理,将需要被扩展的类作为对象组合到装饰类中。

再通过装饰类对待扩展的类进行扩展。

  • 待扩展接口类

    java
    public interface Robot {
    
        void name();
    
        void work();
    
    }
  • 接口实现类

    java
    public class AlertRobot implements Robot {
    
        @Override
        public void name() {
            System.out.println("这是告警机器人");
        }
    
        @Override
        public void work() {
            System.out.println("可以发出告警");
        }
    
    
    }
  • 装饰器类

    java
    public 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();
        }
    
    }
  • 装饰类的实现类(扩展功能)

    一般使用继承的方式,然后添加方法增加功能。

    核心就是不修改原有类,采用新类继承的方式扩展功能。

    java
    public 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:使用哈希表存储已经创建的享元对象,以便快速检索。

使用场景

  1. Java中的String对象:字符串常量池中已经存在的字符串会被复用。
  2. 数据库连接池:数据库连接被复用,避免频繁创建和销毁连接。

享元模式 | 菜鸟教程