引言
面向東西編程(OOP)是現代軟體開辟的基本之一。它供給了一種構造代碼的富強方法,經由過程封裝、持續跟多態等特點,進步了代碼的可重用性、可保護性跟可擴大年夜性。計劃形式,作為面向東西編程的高等現實,是順序員在臨時開辟過程中積聚的寶貴經驗總結。本文將深刻探究面向東西計劃形式,提醒其在高效編程中的檔次奧秘。
計劃形式概述
計劃形式是一套被反覆利用、少數人知曉、經過分類編目標、代碼計劃經驗的總結。利用計劃形式的目標如下:
- 可重用代碼:經由過程計劃形式,可能創建可重用的代碼庫,進步開辟效力。
- 易於懂得:計劃形式供給了代碼實現的通用模板,有助於他人懂得代碼。
- 保證代碼堅固性:遵守計劃形式可能降落錯誤產生的概率,進步代碼的堅固性。
計劃形式平日根據其目標分為以下三類:
- 創建型形式:處理東西的創建過程,包含工廠形式、單例形式跟制作者形式等。
- 構外型形式:處理類跟東西的組合,包含適配器形式、裝潢器形式跟代辦形式等。
- 行動型形式:側重於東西間的通信跟交互,包含戰略形式、察看者形式跟命令形式等。
創建型形式
工廠形式(Factory Pattern)
工廠形式用於創建東西,並暗藏創建邏輯,解耦客戶端代碼與具體類。它包含工廠類跟產品類。
class Product {
public:
virtual ~Product() {}
};
class ConcreteProductA : public Product {
public:
// 實現具體產品A
};
class ConcreteProductB : public Product {
public:
// 實現具體產品B
};
class Factory {
public:
static Product* CreateProduct(std::string type) {
if (type == "A") {
return new ConcreteProductA();
} else if (type == "B") {
return new ConcreteProductB();
}
return nullptr;
}
};
單例形式(Singleton Pattern)
單例形式確保一個類只有一個實例,並供給全局拜訪點。
class Singleton {
private:
static Singleton* instance;
Singleton() {}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
public:
static Singleton* GetInstance() {
if (instance == nullptr) {
instance = new Singleton();
}
return instance;
}
};
制作者形式(Builder Pattern)
制作者形式分步構建複雜東西,支撐可選設置。
class Builder {
public:
virtual void BuildPartA() = 0;
virtual void BuildPartB() = 0;
virtual Product* GetResult() = 0;
};
class ConcreteBuilder : public Builder {
private:
Product* product;
public:
ConcreteBuilder() : product(new Product()) {}
void BuildPartA() override {
product->AddPartA();
}
void BuildPartB() override {
product->AddPartB();
}
Product* GetResult() override {
return product;
}
};
class Director {
public:
Builder* builder;
Director(Builder* b) : builder(b) {}
void Construct() {
builder->BuildPartA();
builder->BuildPartB();
}
};
構外型形式
適配器形式(Adapter Pattern)
適配器形式讓不兼容介面的類協同任務,經由過程轉換介面。
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();
}
};
裝潢器形式(Decorator Pattern)
裝潢器形式在不改變原有東西構造的情況下,靜態增加新行動。
class Component {
public:
virtual void Operation() = 0;
};
class ConcreteComponent : public Component {
public:
void Operation() override {
// 實現具體操縱
}
};
class Decorator : public Component {
protected:
Component* component;
public:
Decorator(Component* c) : component(c) {}
void Operation() override {
component->Operation();
// 增加新行動
}
};
代辦形式(Proxy Pattern)
代辦形式作為一個佔位符,用於拜訪另一個東西。
class Subject {
public:
virtual void Request() = 0;
};
class RealSubject : public Subject {
public:
void Request() override {
// 實現具體懇求
}
};
class Proxy : public Subject {
private:
RealSubject* realSubject;
public:
Proxy(RealSubject* rs) : realSubject(rs) {}
void Request() override {
realSubject->Request();
}
};
行動型形式
戰略形式(Strategy Pattern)
戰略形式在運轉時從一組可調換的戰略中抉擇演算法或行動。
class Strategy {
public:
virtual void AlgorithmInterface() = 0;
};
class ConcreteStrategyA : public Strategy {
public:
void AlgorithmInterface() override {
// 實現戰略A
}
};
class ConcreteStrategyB : public Strategy {
public:
void AlgorithmInterface() override {
// 實現戰略B
}
};
class Context {
private:
Strategy* strategy;
public:
Context(Strategy* s) : strategy(s) {}
void SetStrategy(Strategy* s) {
strategy = s;
}
void ContextInterface() {
strategy->AlgorithmInterface();
}
};
察看者形式(Observer Pattern)
察看者形式樹破一對多的依附關係,當一個東西狀況改變時,全部它的依附東西都會收到告訴。
class Subject {
private:
std::list<Observer*> observers;
public:
void Attach(Observer* o) {
observers.push_back(o);
}
void Notify() {
for (Observer* o : observers) {
o->Update();
}
}
};
class Observer {
public:
virtual void Update() = 0;
};
class ConcreteObserverA : public Observer {
public:
void Update() override {
// 實現具體更新
}
};
命令形式(Command Pattern)
命令形式用一個東西封裝執舉舉措或觸發變亂所需的全部信息。
class Command {
public:
virtual void Execute() = 0;
};
class ConcreteCommandA : public Command {
private:
Receiver* receiver;
public:
ConcreteCommandA(Receiver* r) : receiver(r) {}
void Execute() override {
receiver->Action();
}
};
class Receiver {
public:
void Action() {
// 實現具體舉措
}
};
總結
面向東西計劃形式是順序員寶貴的經驗總結,它有助於進步代碼的可重用性、可保護性跟可擴大年夜性。經由過程本文的介紹,妳應當曾經迎面向東西計劃形式有了更深刻的懂得。在現實編程中,根據具體須要抉擇合適的計劃形式,將有助於妳構建高品質、可保護的軟體系統。