返回

轻松掌握 Java 设计模式:开启代码质量新篇章

后端

探索 Java 设计模式:开启代码质量新篇章

在当今瞬息万变的数字世界,软件开发不再仅仅是让代码运行。优秀的程序员追求的是代码的质量、性能和灵活性,以满足不断变化的业务需求。而 Java 设计模式 正是通往代码质量新高度的指南针。

何为 Java 设计模式?

Java 设计模式是一套经过验证、可重用的解决方案,旨在解决软件开发中常见的挑战。通过运用设计模式,你可以轻松驾驭代码的复杂性,提升代码的可维护性、可扩展性和灵活性。

掌握设计模式核心理念

在踏上 Java 设计模式之旅之前,先让我们掌握其核心理念:

  • 单一职责原则: 让每个类只负责一项职责,提高代码的可读性和可维护性。
  • 开放-封闭原则: 使类对扩展开放,对修改关闭,让代码更易于扩展和维护。
  • 里氏替换原则: 子类可以替换父类,而不会破坏系统的行为,确保代码的可重用性和可靠性。
  • 接口隔离原则: 将接口设计得独立且细粒度,让代码更具灵活性。
  • 依赖倒置原则: 让高层模块不依赖于低层模块,而是依赖于抽象,提高代码的松耦合性和可测试性。
  • 合成复用原则: 通过组合而不是继承来实现代码的复用,提高代码的灵活性。
  • 迪米特法则: 一个类应该只与那些它真正需要耦合的其他类耦合,减少代码的复杂性和提高可维护性。

常见设计模式一览

Java 设计模式库浩如烟海,我们精选了最常见的 10 种模式,为你开启代码质量之旅:

  • 工厂模式: 创建对象的工厂,让代码更具灵活性。
public interface Shape {
    void draw();
}

public class Square implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a square");
    }
}

public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a circle");
    }
}

public class ShapeFactory {
    public Shape getShape(String shapeType) {
        if (shapeType.equalsIgnoreCase("SQUARE")) {
            return new Square();
        } else if (shapeType.equalsIgnoreCase("CIRCLE")) {
            return new Circle();
        }
        return null;
    }
}
  • 建造者模式: 通过一步一步地构建复杂对象,让代码更易于理解和维护。
public class House {
    private int rooms;
    private int windows;
    private int doors;

    public static class Builder {
        private House house;

        public Builder() {
            house = new House();
        }

        public Builder setRooms(int rooms) {
            house.rooms = rooms;
            return this;
        }

        public Builder setWindows(int windows) {
            house.windows = windows;
            return this;
        }

        public Builder setDoors(int doors) {
            house.doors = doors;
            return this;
        }

        public House build() {
            return house;
        }
    }
}
  • 单例模式: 确保一个类只有一个实例,让代码更具性能和安全性。
public class Singleton {
    private static Singleton instance;

    private Singleton() {
        // Private constructor to prevent instantiation
    }

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
  • 原型模式: 通过复制一个现有的对象来创建新的对象,提高代码的效率。
public class Shape implements Cloneable {
    private String shapeType;

    public Shape(String shapeType) {
        this.shapeType = shapeType;
    }

    @Override
    public Object clone() {
        try {
            return super.clone();
        } catch (CloneNotSupportedException e) {
            return null;
        }
    }
}

public class Circle extends Shape {
    private double radius;

    public Circle(String shapeType, double radius) {
        super(shapeType);
        this.radius = radius;
    }

    @Override
    public Object clone() {
        return new Circle(shapeType, radius);
    }
}
  • 装饰模式: 在不改变对象本身的情况下,动态地给对象添加新的功能,提高代码的灵活性。
public interface Shape {
    void draw();
}

public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a circle");
    }
}

public class ShapeDecorator implements Shape {
    protected Shape decoratedShape;

    public ShapeDecorator(Shape decoratedShape) {
        this.decoratedShape = decoratedShape;
    }

    @Override
    public void draw() {
        decoratedShape.draw();
    }
}

public class RedShapeDecorator extends ShapeDecorator {
    public RedShapeDecorator(Shape decoratedShape) {
        super(decoratedShape);
    }

    @Override
    public void draw() {
        decoratedShape.draw();
        System.out.println("Color: Red");
    }
}
  • 代理模式: 为对象提供一个代理或替代,让代码更具安全性、灵活性或性能。
public interface Image {
    void display();
}

public class RealImage implements Image {
    private String filename;

    public RealImage(String filename) {
        this.filename = filename;
        loadImageFromDisk();
    }

    private void loadImageFromDisk() {
        // Code to load image from disk
    }

    @Override
    public void display() {
        System.out.println("Displaying image " + filename);
    }
}

public class ProxyImage implements Image {
    private String filename;
    private RealImage realImage;

    public ProxyImage(String filename) {
        this.filename = filename;
    }

    @Override
    public void display() {
        if (realImage == null) {
            realImage = new RealImage(filename);
        }
        realImage.display();
    }
}
  • 适配器模式: 让两个不兼容的类能够一起工作,提高代码的兼容性和灵活性。
public interface Bird {
    void fly();
    void makeSound();
}

public class Sparrow implements Bird {
    @Override
    public void fly() {
        System.out.println("Sparrow is flying");
    }

    @Override
    public void makeSound() {
        System.out.println("Sparrow is chirping");
    }
}

public class ToyDuck {
    public void squeak() {
        System.out.println("Toy duck is squeaking");
    }
}

public class BirdAdapter implements Bird {
    private ToyDuck toyDuck;

    public BirdAdapter(ToyDuck toyDuck) {
        this.toyDuck = toyDuck;
    }

    @Override
    public void fly() {
        toyDuck.squeak();
        toyDuck.squeak();
    }

    @Override
    public void makeSound() {
        toyDuck.squeak();
    }
}
  • 桥接模式: 将抽象和实现解耦,让代码更易于扩展和维护。
public interface Shape {
    void draw();
}

public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a circle");
    }
}

public class Square implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a square");
    }
}

public interface Color {
    void fill();
}

public class Red implements Color {
    @Override
    public void fill() {
        System.out.println("Filling with red color");
    }
}

public class Blue implements Color {
    @Override
    public void fill() {
        System.out.println("Filling with blue color");
    }
}

public class ShapeBridge {
    private Shape shape;
    private Color color;

    public ShapeBridge(Shape shape, Color color) {
        this.shape = shape;
        this.color = color;
    }

    public void draw() {
        shape.draw();
        color.fill();
    }
}
  • 组合模式: 将对象组合成树形结构,让代码更具组织性和可扩展性。
public interface Shape {
    void draw();
}

public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a circle");