MST
星途 面试题库

面试题:Java享元模式与其他设计模式的结合应用

在复杂的Java系统设计中,享元模式常常需要与其他设计模式结合使用以满足多样化的需求。请举例说明享元模式可以与哪些设计模式结合,以及在实际项目场景中如何结合使用这些模式来优化系统架构和提高性能。
48.2万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

享元模式与其他模式结合及应用

  1. 与工厂模式结合
    • 结合原因:享元模式中需要创建并管理享元对象,工厂模式可负责创建享元对象,将对象创建逻辑封装,提高代码的可维护性和可扩展性。
    • 实际场景:在图形绘制系统中,假设存在多种不同颜色但相同形状的图形(如圆形、矩形),每种图形对象为享元对象。使用工厂模式创建享元对象,当需要绘制图形时,通过工厂获取相应的享元图形对象。例如:
// 享元图形接口
interface Shape {
    void draw();
}

// 具体享元图形类
class Circle implements Shape {
    private String color;
    public Circle(String color) {
        this.color = color;
    }
    @Override
    public void draw() {
        System.out.println("Drawing a " + color + " circle.");
    }
}

// 享元工厂类
class ShapeFactory {
    private static final Map<String, Shape> shapeMap = new HashMap<>();
    public static Shape getShape(String color) {
        Shape shape = shapeMap.get(color);
        if (shape == null) {
            shape = new Circle(color);
            shapeMap.put(color, shape);
        }
        return shape;
    }
}
- **优化效果**:避免了重复创建相同颜色图形对象,减少内存占用,提高对象创建效率。

2. 与代理模式结合 - 结合原因:代理模式可在访问享元对象时添加额外的逻辑,如权限控制、缓存管理等,同时不影响享元模式本身的共享特性。 - 实际场景:在一个多用户在线文档编辑系统中,文档内容为享元对象。使用代理模式控制用户对文档的访问权限,只有具有相应权限的用户才能获取和修改文档享元对象。例如:

// 享元文档接口
interface Document {
    void edit();
}

// 具体享元文档类
class TextDocument implements Document {
    @Override
    public void edit() {
        System.out.println("Editing the text document.");
    }
}

// 代理类
class DocumentProxy implements Document {
    private Document document;
    private User user;
    public DocumentProxy(User user) {
        this.user = user;
    }
    @Override
    public void edit() {
        if (user.hasPermission()) {
            if (document == null) {
                document = new TextDocument();
            }
            document.edit();
        } else {
            System.out.println("User has no permission to edit.");
        }
    }
}

class User {
    private boolean hasPermission;
    public User(boolean hasPermission) {
        this.hasPermission = hasPermission;
    }
    public boolean hasPermission() {
        return hasPermission;
    }
}
- **优化效果**:增强了系统的安全性和访问控制,确保只有授权用户能操作享元对象,同时维持享元模式的资源共享优势。 

3. 与组合模式结合 - 结合原因:组合模式用于处理对象的整体 - 部分层次结构,享元模式用于对象共享,两者结合可在处理复杂层次结构对象时,实现对象共享,减少内存消耗。 - 实际场景:在一个游戏地图编辑系统中,地图由不同类型的地形块(如草地、岩石)组成,地形块可作为享元对象。使用组合模式构建地图的层次结构,如将多个地形块组合成一个区域。例如:

// 享元地形块接口
interface Terrain {
    void display();
}

// 具体享元地形块类
class Grass implements Terrain {
    @Override
    public void display() {
        System.out.println("Displaying grass.");
    }
}

class Rock implements Terrain {
    @Override
    public void display() {
        System.out.println("Displaying rock.");
    }
}

// 组合类
class Region implements Terrain {
    private List<Terrain> terrains = new ArrayList<>();
    public void addTerrain(Terrain terrain) {
        terrains.add(terrain);
    }
    @Override
    public void display() {
        for (Terrain terrain : terrains) {
            terrain.display();
        }
    }
}
- **优化效果**:既利用享元模式减少相同地形块的重复创建,又通过组合模式灵活构建复杂的地图结构,优化了系统架构和性能。