设计模式(1)

开闭原则:

概念:开闭原则:对扩展开放,对修改关闭,增加功能是通过增加代码实现的,而不是去修改源代码

例如实现计算器的加减乘除:

需要建立的是以个抽象类,把实现方法放在子类里面进行重写。避免在修改中,出现错误,查找错误不方便。

原来代码:

#define  _CRT_SECURE_NO_WARNINGS 
#include <iostream>

using namespace std;
// 开闭原则 对扩展开放,对修改关闭,增加功能是通过增加代码来实现,而不是去修改源代码


//语算器类
class Caculaor{
private:
	int m_a;
	int m_b;
	string m_operator;
	int m_ret;
public:
	Caculaor(int a, int b, string moperator){
		this->m_a = a;
		this->m_b = b;
		this->m_operator = moperator;
	}


	int getResult(){
		if (m_operator.compare("+") == 0){
			return m_a + m_b;
		}
		else if (m_operator.compare("-") == 0){
			return m_a - m_b;
		}
		else if (m_operator.compare("*") == 0){
			return m_a*m_b;
		}
		else if (m_operator.compare("/") == 0) {
			return m_a / m_b;
		}
	}

};
/*
缺点:如果增加取模的运算需要修改getResult成员方法,如果增加新功能的情况下要修改调代码,那么
就会有修改出错的可能性。
我们应该在增加新的功能时候,不能影响其他已经完成的功能。
这就是对修改关闭,对扩展开放,叫做开闭原则
*/


void test01(){
	Caculaor* caculator = new Caculaor(10, 20, "+");
	cout << caculator->getResult() << endl;
}


int main(){
	test01();
	return 0;
}

修改之后: 

#define  _CRT_SECURE_NO_WARNINGS 
#include <iostream>

using namespace std;
// 开闭原则 对扩展开放,对修改关闭,增加功能是通过增加代码来实现,而不是去修改源代码


//写一个抽象类
class AbstractCaculator{
	public:
		virtual int getResult() = 0;//纯虚函数
		virtual void setOperatorNumber(int a, int b)=0;
};

//加法计算器类
class PlusCaculator :public AbstractCaculator{
		public:
			int mA;
			int mB;
		
		public:
			virtual void setOperatorNumber(int a, int b){
				   this->mA = a; 
				   this->mB = b; 
			}

			virtual int getResult(){
				return mA + mB;
			}
			   

};



//减法计算器类
class MinuteCaculator :public AbstractCaculator{
public:
	int mA;
	int mB;

public:
	virtual void setOperatorNumber(int a, int b){
		this->mA = a;
		this->mB = b;
	}

	virtual int getResult(){
		return mA - mB;
	}

};

//乘法计算器类
class MultiplyCaculator :public AbstractCaculator{
public:
	int mA;
	int mB;

public:
	virtual void setOperatorNumber(int a, int b){
		this->mA = a;
		this->mB = b;
	}

	virtual int getResult(){
		return mA * mB;
	}

};

//取模计算器类,通过增加代码,而不是修改原来的
class QumoCaculator :public AbstractCaculator{
public:
	int mA;
	int mB;

public:
	virtual void setOperatorNumber(int a, int b){
		this->mA = a;
		this->mB = b;
	}

	virtual int getResult(){
		return mA % mB;
	}

};



void test01() {
	AbstractCaculator * caculator = new PlusCaculator;
	caculator->setOperatorNumber(10, 20);
	cout << "ret:" << caculator->getResult() << endl;

	 caculator = new MinuteCaculator;
	caculator->setOperatorNumber(10, 20);
	cout << "ret:" << caculator->getResult() << endl;
}

int main(){
	test01();
	return 0;
}

迪米特法则:

最小知识原则:在用户与底层的中间层之间建立中间层 即一个对象应尽量的对其他对象少了解,降低哥哥对象之间的耦合

例如:下面例子建立的中间层,在test2调用时不用具体的接触 building类

#define  _CRT_SECURE_NO_WARNINGS 
#include <iostream>
#include <string>
#include <vector>

using namespace std;
//迪米特法则又叫最少知识原则


//写一个抽象类
class AbstractBuilding{
public:
	string mQulity;
public: 
	virtual void sale() = 0;
	virtual string getQuality() = 0;
};

//楼盘A 
class BuildingA :public AbstractBuilding{

public:
	BuildingA(){
		mQulity = "高品质";
	}

	virtual void sale(){
		cout << "楼盘A" << mQulity << "被售卖!" << endl;
	}

	virtual string getQuality(){
		return mQulity;
	};

};

//楼盘B 
class BuildingB :public AbstractBuilding{

public:
	BuildingB(){
		mQulity = "低品质";
	}

	virtual void sale(){
		cout << "楼盘A" << mQulity << "被售卖!" << endl;
	}
	virtual string getQuality(){
		return mQulity;
	};

};








void test01() {
	BuildingA*ba = new BuildingA; 
	if (ba->mQulity == "低品质"){
		ba->sale();
	}
	BuildingB*bb = new BuildingB;
	if (bb->mQulity == "低品质"){
		bb->sale();
	}
}

//中介类
class Mediator{
public:
	vector<AbstractBuilding*> vBuilding;
public:
	Mediator(){
		AbstractBuilding* building = new BuildingA;
		vBuilding.push_back(building);
		
	

		building = new BuildingB;
		vBuilding.push_back(building);
	}
	~Mediator(){
		for (
			vector<AbstractBuilding*>::iterator it = vBuilding.begin();
			it != vBuilding.end();
			it++
			){
			if (*it != NULL) delete *it;
		}
	}
	//对外提供接口
	AbstractBuilding* findMyBuilding(string quality){
	
		for (
			vector<AbstractBuilding*>::iterator it = vBuilding.begin();
			it != vBuilding.end();
			it++
			){
			//两个if任选一个
			//if ((*it)->getQuality() == quality) return *it;

			
			if ((*it)->mQulity == quality) return *it;
			
		}
			return NULL;
	}


};


//客户端
void test02(){
	Mediator*mediator = new Mediator;
	AbstractBuilding*building = mediator->findMyBuilding("高品质");
	if (building != NULL){
		building->sale();
	}
	else{
		cout << "没有符合您条件的楼盘!" << endl;
	}

	building = mediator->findMyBuilding("低品质");
	if (building != NULL){
		building->sale();
	}
	else{
		cout << "没有符合您条件的楼盘!" << endl;
	}
}




int main(){
	test02();
	return 0;
}

合成复用原则:

使用继承比较复杂情况,不使用继承,可以优先使用组合

#define  _CRT_SECURE_NO_WARNINGS 
#include <iostream>

using namespace std;

//抽象车
class AbstractCar{
public:
	virtual void run() = 0;
};

//大众车
class Dazhong :public AbstractCar{
public:
	virtual void run(){
		cout << "大众车启动..." << endl;
	}
};


// 拖拉机
class Tuolaji :public AbstractCar{
public:
	virtual void run(){
		cout << "拖拉机启动.." << endl;
	}
}; 

/*
class Person1 : public Tuolaji{
public: 
	void Doufeng(){//兜风
			run();
	}
 };

class Person2 : public Dazhong{
public:
	void Doufeng(){//兜风
		run();
	}
};
*/
//可以使用组合
class Person{
public:
	AbstractCar*car;

public:

	void setCar(AbstractCar*car){
		this->car = car;
	}
	void Doufeng(){
		this->car->run();
		
	}
	~Person(){
		if (this->car != NULL) {
			delete this->car;
                        this->car == null;
		}
	}

};
void test01()
{
	Person* p = new Person;
	p->setCar(new Dazhong);
	p->Doufeng();


	p->setCar(new Tuolaji);
	p->Doufeng();
	delete p;
}

int main(){
	test01();
	return 0;
}

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值