由於手中沒有面向對象的項目,於是決定把大話設計模式用c++寫一遍加深映像!
面向對象的好處:可維護,可擴展,可複用,靈活性好。
原則常記心中:職責單一、開放-封閉、依賴倒轉、迪米特--->(低耦合)
職責單一:多個職責耦合在一起時一個職責變化可能會影響整體,爲了維護更加靈活,儘量讓功能原子化。對一個類而言,應該僅有一個引起它變化的原因。
開放-封閉:類應該可以擴展(開放),但是不可修改(封閉)。
依賴倒轉:針對接口編程,不要對實現編程。把父類都替換成它的子類,程序的行爲沒有變化。
迪米特:如果兩個類不必彼此直接通訊,那麼這兩個類就不應當直接的相互作用。如果其中一個類需要調用另一個類的某一個方法,可以通過第三者轉發這個調用。
策略模式
策略模式
策略模式與簡單工廠模式對比,從Context與OperationFactory可以發現
1、OperationFactory是返回一個Operation指針,而Context是在內部定義一個Operation指針,在內部通過指針調用Operation的方法。
2、客戶端的代碼訪問Context,而簡單工廠需要訪問OperationFactory與Operation。耦合更低
#include<iostream>
#include<stdio.h>
#include <string>
using namespace std;
class Operation{//運算類
protected:
double numberA = 0;
double numberB = 0;
public:
void set_number(double a,double b){
numberA=a;
numberB=b;
}
virtual double GetResult()
{
double result =0;
return result;
}
};
class operationAdd:public Operation{//加法
public:
double GetResult()
{
return numberA+numberB;
}
};
class operationSub:public Operation{//減法
public:
double GetResult()
{
return numberA-numberB;
}
};
//這是一個裝飾類,在裏面管理一個Operation的指針
class Context{
public:
Operation *oper;
Context(string s,int a,int b)
{ //讓他們之間可以互相替換,此模式讓算法的變化不會影響到使用算法的客戶
if(s=="+")oper=new operationAdd();
else if(s=="-")oper=new operationSub();
oper->set_number(a,b);
}
void get_oper()
{
cout<<oper->GetResult();
}
};
int main()
{
//與簡單工廠相比客服端接觸的類只有一個,而簡單工廠需要認識兩個類
Context *who=new Context("+",12,45);
who->get_oper();
return 0;
}
簡單工廠模式是創建的對象,且由該對象調用其內部的指定算法,主要是針對的對象之間的行爲差異,單獨封裝
策略模式是針對的對象內部行爲的算法,可以看作是一個集合,是允許多個策略實體進行疊加的。但工廠模式就不成。
如果在一個系統裏面有許多類,它們之間的區別僅在於它們的行爲,那麼使用策略模式可以動態地讓一個對象在許多行爲中選擇一種行爲。