Skip to content

第12章 面向对象程序设计

📚 章节概述

面向对象程序设计是软考中级软件设计师考试的重要应用题内容,主要考查面向对象编程语言的应用和设计模式的实现。本章将通过典型案例学习C++和Java的面向对象编程技术。

🎯 学习目标

通过本章学习,你将掌握:

  • 面向对象程序设计的基本概念
  • C++和Java语言的核心语法
  • 设计模式的编程实现
  • 代码填空题的解题技巧
  • 面向对象设计原则的应用

📖 课程安排

12.1 面向对象程序设计概述 (1课时)

  • OOP基本概念 - 类、对象、封装、继承、多态
  • 编程语言比较 - C++与Java的特点对比
  • 设计模式应用 - 常用设计模式在编程中的体现
  • 考试要求 - 代码阅读和填空的能力要求

12.2 C++语法要点 (2课时)

  • 类和对象 - 类的定义、构造函数、析构函数
  • 继承机制 - 单继承、多继承、虚继承
  • 多态实现 - 虚函数、纯虚函数、抽象类
  • 模板技术 - 函数模板、类模板
  • STL容器 - vector、list、map等常用容器

12.3 Java语法要点 (2课时)

  • 类和接口 - 类定义、接口实现、抽象类
  • 继承和多态 - extends、implements、方法重写
  • 异常处理 - try-catch-finally、异常类层次
  • 集合框架 - ArrayList、HashMap、Iterator
  • 泛型编程 - 泛型类、泛型方法、通配符

12.4 注意事项及代码填空技巧 (1课时)

  • 代码阅读技巧 - 快速理解程序结构和逻辑
  • 填空策略 - 根据上下文推断缺失代码
  • 常见陷阱 - 语法细节和逻辑错误
  • 时间管理 - 合理分配答题时间

12.5 典型例题分析 (8课时)

12.5.1 例题1:访问者模式 (2课时)

  • 模式概述 - 访问者模式的结构和意图
  • C++实现
    cpp
    class Visitor; // 前向声明
    
    class Element {
    public:
        virtual void accept(Visitor* visitor) = 0;
    };
    
    class ConcreteElementA : public Element {
    public:
        void accept(Visitor* visitor) override {
            visitor->visitConcreteElementA(this);
        }
        void operationA() { /* 具体操作 */ }
    };
    
    class Visitor {
    public:
        virtual void visitConcreteElementA(ConcreteElementA* element) = 0;
        virtual void visitConcreteElementB(ConcreteElementB* element) = 0;
    };
  • Java实现 - 接口定义和具体实现
  • 应用场景 - 对象结构稳定但操作多变的情况

12.5.2 例题2:生成器模式 (2课时)

  • 模式概述 - 建造者模式的结构和应用
  • C++实现
    cpp
    class Product {
    private:
        std::string partA, partB, partC;
    public:
        void setPartA(const std::string& part) { partA = part; }
        void setPartB(const std::string& part) { partB = part; }
        void setPartC(const std::string& part) { partC = part; }
    };
    
    class Builder {
    public:
        virtual void buildPartA() = 0;
        virtual void buildPartB() = 0;
        virtual void buildPartC() = 0;
        virtual Product* getResult() = 0;
    };
  • Java实现 - 链式调用和流式接口
  • 应用场景 - 复杂对象的分步构建

12.5.3 例题3:适配器模式 (2课时)

  • 模式概述 - 适配器模式的两种实现方式
  • 对象适配器
    cpp
    class Target {
    public:
        virtual void request() = 0;
    };
    
    class Adaptee {
    public:
        void specificRequest() {
            // 已存在的接口实现
        }
    };
    
    class Adapter : public Target {
    private:
        Adaptee* adaptee;
    public:
        Adapter(Adaptee* a) : adaptee(a) {}
        void request() override {
            adaptee->specificRequest();
        }
    };
  • 类适配器 - 使用多重继承的实现方式
  • 应用场景 - 接口不兼容的类的集成

12.5.4 例题4:桥接模式 (2课时)

  • 模式概述 - 抽象与实现的分离
  • Java实现
    java
    abstract class Abstraction {
        protected Implementor implementor;
    
        public Abstraction(Implementor implementor) {
            this.implementor = implementor;
        }
    
        public abstract void operation();
    }
    
    interface Implementor {
        void operationImpl();
    }
    
    class ConcreteImplementorA implements Implementor {
        public void operationImpl() {
            // 具体实现A
        }
    }
  • C++实现 - 指针和引用的使用
  • 应用场景 - 避免抽象和实现的永久绑定

⏰ 学习时间安排

  • 总学习时间:14课时
  • 建议学习周期:2-3周
  • 每日学习时间:1-2课时
  • 重点练习:设计模式的代码实现

🔍 重点难点

重点内容

  1. 面向对象特性 - 封装、继承、多态的编程实现
  2. 设计模式 - 常用设计模式的代码结构
  3. 语法细节 - C++和Java的关键语法差异
  4. 代码理解 - 快速阅读和理解程序逻辑
  5. 填空技巧 - 根据上下文推断缺失代码

难点突破

  1. 虚函数机制 - 理解C++的虚函数表和动态绑定
  2. 模板编程 - 掌握C++模板的使用方法
  3. 接口设计 - 理解Java接口和抽象类的区别
  4. 设计模式实现 - 熟练编写模式的标准代码

📝 考试要点

应用题考点

  • 设计模式实现 (15-20分)
  • 代码填空 (10-15分)
  • 程序分析 (8-12分)
  • 语法应用 (5-8分)

常见题型

  1. 代码填空 - 在给定代码中填入缺失部分
  2. 模式识别 - 识别代码中使用的设计模式
  3. 程序改错 - 找出并修正程序中的错误
  4. 功能实现 - 根据需求编写特定功能代码

💻 编程语言对比

C++ vs Java 特性对比

特性C++Java
内存管理手动管理自动垃圾回收
多重继承支持不支持(接口多实现)
指针支持不支持(引用)
模板/泛型模板泛型
编译方式编译为机器码编译为字节码

语法要点对比

cpp
// C++ 类定义
class Shape {
private:
    int x, y;
public:
    Shape(int x, int y) : x(x), y(y) {}
    virtual ~Shape() {}
    virtual void draw() = 0;  // 纯虚函数
};

class Circle : public Shape {
public:
    Circle(int x, int y, int r) : Shape(x, y), radius(r) {}
    void draw() override {
        // 绘制圆形
    }
private:
    int radius;
};
java
// Java 类定义
abstract class Shape {
    protected int x, y;

    public Shape(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public abstract void draw();  // 抽象方法
}

class Circle extends Shape {
    private int radius;

    public Circle(int x, int y, int radius) {
        super(x, y);
        this.radius = radius;
    }

    @Override
    public void draw() {
        // 绘制圆形
    }
}

🎨 设计模式实现

单例模式

cpp
// C++ 线程安全单例
class Singleton {
private:
    static Singleton* instance;
    static std::mutex mtx;
    Singleton() {}

public:
    static Singleton* getInstance() {
        if (instance == nullptr) {
            std::lock_guard<std::mutex> lock(mtx);
            if (instance == nullptr) {
                instance = new Singleton();
            }
        }
        return instance;
    }
};
java
// Java 枚举单例
public enum Singleton {
    INSTANCE;

    public void doSomething() {
        // 业务逻辑
    }
}

工厂方法模式

java
// Java 工厂方法实现
interface Product {
    void use();
}

class ConcreteProductA implements Product {
    public void use() {
        System.out.println("使用产品A");
    }
}

abstract class Creator {
    public abstract Product factoryMethod();

    public void anOperation() {
        Product product = factoryMethod();
        product.use();
    }
}

class ConcreteCreatorA extends Creator {
    public Product factoryMethod() {
        return new ConcreteProductA();
    }
}

🔧 代码填空技巧

解题策略

  1. 通读全文 - 理解程序的整体结构和功能
  2. 分析上下文 - 根据前后代码推断缺失内容
  3. 识别模式 - 判断使用的设计模式
  4. 语法检查 - 确保填入代码符合语法规范
  5. 逻辑验证 - 验证填入代码的逻辑正确性

常见填空类型

  1. 方法调用 - 对象方法的调用语句
  2. 变量声明 - 变量类型和初始化
  3. 条件判断 - if语句的条件表达式
  4. 循环控制 - for/while循环的控制语句
  5. 异常处理 - try-catch语句的补充

预计完成时间:14课时 | 难度等级:★★★★★