Java控制台字符画生成器:图案绘制与代码优化实践
在Java程序开发中,控制台输出往往给人枯燥的印象,但如果我们利用字符组合成图案,就能让控制台输出变得生动有趣。字符画生成器不仅能提升程序的趣味性,还能帮助我们理解循环、字符处理等基础语法的灵活运用。本文将带大家从零实现一个简单的控制台字符画生成器,并逐步优化代码逻辑。
一、基础版本:绘制简单矩形图案
我们先从最基础的矩形图案入手,实现在控制台打印指定行数、列数的由星号组成的矩形。核心思路是通过两层嵌套循环,外层控制行数,内层控制每行的字符输出数量。
public class CharArtGenerator {
public static void main(String[] args) {
// 定义矩形的行数和列数
int rows = 5;
int cols = 10;
// 定义绘制使用的字符
char drawChar = '*';
// 外层循环控制行数
for (int i = 0; i < rows; i++) {
// 内层循环控制每行的字符数量
for (int j = 0; j < cols; j++) {
System.out.print(drawChar);
}
// 每行结束后换行
System.out.println();
}
}
}运行上述代码后,控制台会输出一个5行10列的星号矩形。这里我们用System.out.print输出字符不换行,用System.out.println实现行末换行,两层循环的结构非常清晰,适合初学者理解嵌套循环的执行逻辑。
二、扩展功能:支持三角形与菱形图案
单一矩形图案的实用性有限,我们可以扩展生成器,支持绘制直角三角形、等腰三角形和菱形等常见图案。我们可以通过方法封装不同的绘制逻辑,让代码结构更清晰。
public class CharArtGenerator {
// 绘制直角三角形,direction为0表示左对齐,1表示右对齐
public static void drawRightTriangle(int height, char drawChar, int direction) {
for (int i = 1; i <= height; i++) {
if (direction == 0) {
// 左对齐直角三角形
for (int j = 0; j < i; j++) {
System.out.print(drawChar);
}
} else {
// 右对齐直角三角形,先输出空格再输出字符
for (int j = 0; j < height - i; j++) {
System.out.print(" ");
}
for (int j = 0; j < i; j++) {
System.out.print(drawChar);
}
}
System.out.println();
}
}
// 绘制等腰三角形
public static void drawIsoscelesTriangle(int height, char drawChar) {
for (int i = 1; i <= height; i++) {
// 输出前面的空格
for (int j = 0; j < height - i; j++) {
System.out.print(" ");
}
// 输出字符,每行星号数量为2*i-1
for (int j = 0; j < 2 * i - 1; j++) {
System.out.print(drawChar);
}
System.out.println();
}
}
// 绘制菱形
public static void drawDiamond(int height, char drawChar) {
// 菱形的上半部分(包含中间行)
for (int i = 1; i <= (height + 1) / 2; i++) {
for (int j = 0; j < (height + 1) / 2 - i; j++) {
System.out.print(" ");
}
for (int j = 0; j < 2 * i - 1; j++) {
System.out.print(drawChar);
}
System.out.println();
}
// 菱形的下半部分
for (int i = (height - 1) / 2; i >= 1; i--) {
for (int j = 0; j < (height + 1) / 2 - i; j++) {
System.out.print(" ");
}
for (int j = 0; j < 2 * i - 1; j++) {
System.out.print(drawChar);
}
System.out.println();
}
}
public static void main(String[] args) {
System.out.println("=== 左对齐直角三角形 ===");
drawRightTriangle(5, '*', 0);
System.out.println("\n=== 右对齐直角三角形 ===");
drawRightTriangle(5, '*', 1);
System.out.println("\n=== 等腰三角形 ===");
drawIsoscelesTriangle(5, '*');
System.out.println("\n=== 菱形 ===");
drawDiamond(5, '*');
}
}这里我们封装了三个独立的绘制方法,每个方法负责一种图案的逻辑,main方法里通过调用不同的方法输出对应图案。需要注意的是菱形绘制时,我们拆分了上半部分和下半部分的逻辑,避免复杂的判断,让代码可读性更高。
三、代码优化:引入配置类与工厂模式
随着支持的图案类型增加,直接在main方法里硬编码参数会变得难以维护。我们可以引入配置类存储图案参数,同时使用简单的工厂模式来管理不同的绘制器,让代码符合开闭原则,后续新增图案类型时不需要修改原有代码。
import java.util.HashMap;
import java.util.Map;
// 图案配置类,存储绘制所需的基础参数
class ArtConfig {
private int height;
private char drawChar;
public ArtConfig(int height, char drawChar) {
this.height = height;
this.drawChar = drawChar;
}
public int getHeight() {
return height;
}
public char getDrawChar() {
return drawChar;
}
}
// 绘制器接口,定义统一的绘制方法
interface ArtDrawer {
void draw(ArtConfig config);
}
// 矩形绘制器实现
class RectangleDrawer implements ArtDrawer {
@Override
public void draw(ArtConfig config) {
int rows = config.getHeight();
int cols = config.getHeight() * 2; // 矩形列数设为行数的2倍
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
System.out.print(config.getDrawChar());
}
System.out.println();
}
}
}
// 等腰三角形绘制器实现
class IsoscelesTriangleDrawer implements ArtDrawer {
@Override
public void draw(ArtConfig config) {
int height = config.getHeight();
for (int i = 1; i <= height; i++) {
for (int j = 0; j < height - i; j++) {
System.out.print(" ");
}
for (int j = 0; j < 2 * i - 1; j++) {
System.out.print(config.getDrawChar());
}
System.out.println();
}
}
}
// 绘制器工厂,根据图案类型返回对应的绘制器
class DrawerFactory {
private static final Map<String, ArtDrawer> DRAWER_MAP = new HashMap<>();
static {
DRAWER_MAP.put("rectangle", new RectangleDrawer());
DRAWER_MAP.put("triangle", new IsoscelesTriangleDrawer());
}
public static ArtDrawer getDrawer(String type) {
ArtDrawer drawer = DRAWER_MAP.get(type);
if (drawer == null) {
throw new IllegalArgumentException("不支持的图案类型:" + type);
}
return drawer;
}
}
public class CharArtGenerator {
public static void main(String[] args) {
// 配置矩形参数
ArtConfig rectConfig = new ArtConfig(4, '#');
// 获取矩形绘制器并绘制
ArtDrawer rectDrawer = DrawerFactory.getDrawer("rectangle");
System.out.println("=== 矩形图案 ===");
rectDrawer.draw(rectConfig);
// 配置三角形参数
ArtConfig triangleConfig = new ArtConfig(5, '*');
// 获取三角形绘制器并绘制
ArtDrawer triangleDrawer = DrawerFactory.getDrawer("triangle");
System.out.println("\n=== 等腰三角形图案 ===");
triangleDrawer.draw(triangleConfig);
}
}优化后的代码将参数管理、绘制逻辑、对象创建拆分到不同的类中,职责更加清晰。如果后续要新增菱形绘制功能,只需要新增一个实现ArtDrawer接口的菱形绘制器类,再在DrawerFactory的静态代码块中注册即可,完全不需要修改原有绘制器和工厂的逻辑。
四、总结
从一个简单的矩形绘制到结构清晰的字符画生成器,我们逐步用到了嵌套循环、方法封装、接口、工厂模式等Java基础知识和设计思想。这个小项目的核心价值不仅在于能输出好看的字符画,更在于它能帮我们理解如何将零散的语法知识组合成结构合理的程序。大家可以在此基础上继续扩展,比如支持自定义图案、从文件读取图案配置、添加颜色输出等功能,进一步提升自己的Java编程能力。
Java控制台字符画嵌套循环工厂模式代码优化图案绘制修改时间:2026-05-24 12:18:45