C++面试题:如何实现设计模式?

在C++面试中,设计模式是一个经常被提及的话题。掌握设计模式不仅有助于提高代码的可读性和可维护性,还能体现开发者对软件工程的深刻理解。本文将深入探讨如何在C++中实现设计模式,帮助读者在面试中脱颖而出。

一、设计模式概述

设计模式是软件工程中解决常见问题的经验总结。它可以帮助开发者编写出更加优雅、可维护的代码。在C++中,常见的几种设计模式包括:

  1. 单例模式(Singleton):确保一个类只有一个实例,并提供一个全局访问点。
  2. 工厂模式(Factory):创建对象时,不直接实例化对象,而是通过工厂类来创建对象。
  3. 观察者模式(Observer):当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知。
  4. 策略模式(Strategy):定义一系列算法,将每个算法封装起来,并使它们可以互换。

二、单例模式实现

1. 饿汉式

class Singleton {
public:
static Singleton& getInstance() {
static Singleton instance;
return instance;
}

private:
Singleton() {}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
};

2. 懒汉式

class Singleton {
public:
static Singleton* getInstance() {
static Singleton* instance = nullptr;
if (instance == nullptr) {
instance = new Singleton();
}
return instance;
}

private:
Singleton() {}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
};

三、工厂模式实现

class ProductA {
public:
void operation() {
// ...
}
};

class ProductB {
public:
void operation() {
// ...
}
};

class Factory {
public:
static ProductA* createProductA() {
return new ProductA();
}

static ProductB* createProductB() {
return new ProductB();
}
};

四、观察者模式实现

class Observer {
public:
virtual void update() = 0;
};

class Subject {
public:
virtual void attach(Observer* observer) = 0;
virtual void detach(Observer* observer) = 0;
virtual void notify() = 0;
};

class ConcreteSubject : public Subject {
private:
std::vector observers;

public:
void attach(Observer* observer) override {
observers.push_back(observer);
}

void detach(Observer* observer) override {
observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());
}

void notify() override {
for (Observer* observer : observers) {
observer->update();
}
}
};

class ConcreteObserver : public Observer {
public:
void update() override {
// ...
}
};

五、策略模式实现

class Strategy {
public:
virtual void execute() = 0;
};

class ConcreteStrategyA : public Strategy {
public:
void execute() override {
// ...
}
};

class ConcreteStrategyB : public Strategy {
public:
void execute() override {
// ...
}
};

class Context {
private:
Strategy* strategy;

public:
Context(Strategy* strategy) : strategy(strategy) {}

void setStrategy(Strategy* strategy) {
this->strategy = strategy;
}

void executeStrategy() {
strategy->execute();
}
};

六、案例分析

以下是一个使用观察者模式的案例:

class WeatherStation {
private:
float temperature;
float humidity;
std::vector observers;

public:
void attach(Observer* observer) {
observers.push_back(observer);
}

void detach(Observer* observer) {
observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());
}

void notify() {
for (Observer* observer : observers) {
observer->update();
}
}

void setTemperature(float temperature) {
this->temperature = temperature;
notify();
}

void setHumidity(float humidity) {
this->humidity = humidity;
notify();
}
};

class WeatherDisplay : public Observer {
private:
float temperature;
float humidity;

public:
void update() override {
// 更新显示信息
}
};

在这个案例中,WeatherStation 类是一个被观察者,而 WeatherDisplay 类是一个观察者。当 WeatherStation 的温度或湿度发生变化时,它会通知所有观察者,并更新它们的显示信息。

通过以上分析,相信读者已经对如何在C++中实现设计模式有了深入的了解。在面试中,掌握这些设计模式将有助于你更好地展示自己的编程能力。

猜你喜欢:禾蛙接单