C++面试题:如何实现设计模式?
在C++面试中,设计模式是一个经常被提及的话题。掌握设计模式不仅有助于提高代码的可读性和可维护性,还能体现开发者对软件工程的深刻理解。本文将深入探讨如何在C++中实现设计模式,帮助读者在面试中脱颖而出。
一、设计模式概述
设计模式是软件工程中解决常见问题的经验总结。它可以帮助开发者编写出更加优雅、可维护的代码。在C++中,常见的几种设计模式包括:
- 单例模式(Singleton):确保一个类只有一个实例,并提供一个全局访问点。
- 工厂模式(Factory):创建对象时,不直接实例化对象,而是通过工厂类来创建对象。
- 观察者模式(Observer):当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知。
- 策略模式(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++中实现设计模式有了深入的了解。在面试中,掌握这些设计模式将有助于你更好地展示自己的编程能力。
猜你喜欢:禾蛙接单