设计模式的概念和目的:
概念:设计模式是一套被反复使用、多数人知晓的、经过分目编类的、代码设计经验的总结。
目的:使用设计模式是为了可重用代码,让代码更容易被他人理解,保证代码的可靠性。设计模式使代码编制真正工程化。
设计模式的分类:
(1)创建型模式:通常和对象的创建有关,涉及到对象实例化的方式。(共5种模式)
(2)结构型模式:描述的是如何组合类和对象以获得更大的结构。(共7种模式)
(3)行为型模式:用来对类或对象怎样交互和怎样分配职责进行描述。(共11种模式)
设计模式的基本原则:
(1)开放封闭原则:类的改动是通过增加代码进行的,而不是修改源代码。
(2)依赖倒置原则:依赖于抽象(接口),不要依赖具体的实现(类),也就是针对接口编程。
(3)接口隔离原则:不应该强迫客户的程序依赖他们不需要的接口方法。一个接口应该只提供一种对外功能。
(4)里氏替换原则:任何抽象类出现的地方都可以用他的实现类进行替换。实际就是虚拟机制,语言级别实现面向对象功能。
(5)合成复用原则:如果使用继承,会导致父类的任何变换都可能影响到子类的行为。如果使用对象组合,就降低了这种依赖 关系。
(6)迪米特法则:一个软件实体应当尽可能少地与其他实体发生相互作用。
这里用代码重点描述前两个原则:
1、开放封闭原则:
//开放封闭原则
#include<iostream>
using namespace std;
/*
class BankWorker
{
public:
void SaveMoney()
{
cout<< "SaveMoney" <<endl;
}
void GetMoney()
{
cout<< "GetMoney" <<endl;
}
void TransformMoney()
{
cout<< "TransformMoney" <<endl;
}
};
*/
class BankWorker //增加代码 而不修改源代码
{
public:
virtual void work() = 0;
};
class SaveMoney : public BankWorker
{
public:
void work()
{
cout<< "SaveMoney" <<endl;
}
};
class GetMoney : public BankWorker
{
public:
void work()
{
cout<< "GetMoney" <<endl;
}
};
class TransformMoney : public BankWorker
{
public:
void work()
{
cout<< "TransformMoney" <<endl;
}
};
//如果增加功能 可再添加类
int main()
{
/*
BankWorker *b = new BankWorker;
b->SaveMoney();
b->GetMoney();
delete b;
*/
BankWorker *b = NULL; //增加代码后调用也变化
b = new SaveMoney;
b->work();
return 0;
}
2、依赖倒置原则:
//依赖倒置原则
#include<iostream>
using namespace std;
class RAM //抽象
{
public:
virtual void RAMwork() = 0;
};
class RAM_2G : public RAM //实现 依赖于抽象
{
public:
void RAMwork()
{
cout<< "RAM_2G" <<endl;
}
};
class RAM_4G : public RAM //实现
{
public:
void RAMwork()
{
cout<< "RAM_4G" <<endl;
}
};
class ROM //抽象
{
public:
virtual void ROMwork() = 0;
};
class ROM_32G : public ROM //实现
{
public:
void ROMwork()
{
cout<< "ROM_32G" <<endl;
}
};
class ROM_64G : public ROM //实现
{
public:
void ROMwork()
{
cout<< "ROM_64G" <<endl;
}
};
class Phone
{
private:
RAM *ram;
ROM *rom;
public:
Phone(RAM *a , ROM *o)
{
ram = a;
rom = o;
}
void Phonework()
{
ram->RAMwork();
rom->ROMwork();
}
};
int main()
{
RAM *ram = new RAM_2G;
ROM *rom = new ROM_32G;
Phone *p = new Phone(ram , rom);
p->Phonework();
delete ram;
delete rom;
delete p;
cout<< "---------------" <<endl;
ram = new RAM_4G;
rom = new ROM_64G;
p = new Phone(ram , rom);
p->Phonework();
delete ram;
delete rom;
delete p;
return 0;
}