设计模式-依赖倒转原则

A、 高层模块不应该依赖底层模块。两个都应该依赖抽象

B、 抽象不应该依赖细节,细节应该依赖抽象(针对接口编程,不要针对实现)

里氏代换原则:

一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出父类对象和子类对象的区别,也就是说,在软件里面,把父类都替换成它的子类,程序的行为没有变化。简单的说就是,子类型必须能够替换他们的父类型。

只有当子类可以替换掉父类,软件单位的功能不受影响时,父类才能够真正的被复用,而子类也能够在父类的基础上增加新的行为。

依赖倒转原则其实可以说是面向对象设计的标志,如果编写时考虑的都是如何针对抽象编程而不是针对细节编程,即程序中所有依赖关系都是终止于抽象或者是接口,那就是面向对象的设计,反之就是过程化的设计。

面向过程的开发,上层调用下层,上层依赖下层,当下层剧烈变动时上层也要跟着变动,这就会导致模块的复用性降低而且大大提高了开发成本。

面向对象很好的解决了这一问题,一般情况下抽象的变化概率很小,让用户程序依赖抽象,实现的细节也依赖抽象。即使细节不断变动,只要抽象不变,客户程序就不需要变化。这大大降低了客户程序和实现细节的耦合程度。

 

实例分析:

福特和本田的合伙公司,要求开发一套自动驾驶系统,只要汽车装上系统就可以实现无人驾驶,该系统当前只能在福特和本田上使用。

开发方法:基本面向过程的解答。

class HondaCar
{
public:
    explicit HondaCar(){}
	~HondaCar(){}

	void Run(){ cout << "本田启动" <<endl;}
	void Turn(){cout << "本田转弯" <<endl;}
	void Stop(){cout << "本田停" <<endl;}
};

class FordCar
{
public:
	explicit FordCar(){}
	~FordCar(){}

	void Run(){ cout << "福特启动" <<endl;}
	void Turn(){cout << "福特转弯" <<endl;}
	void Stop(){cout << "福特停车" <<endl;}
};

class AutoSystem
{
public:
	explicit AutoSystem(string type):m_HCar(new HondaCar),m_FCar(new FordCar),m_CarType(type){}
	~AutoSystem(){}

	string m_CarType;
	void RunCar()
	{
		if (strcmp(m_CarType.c_str(),"Ford")==0)
		{
			m_FCar->Run();
		}else
		{
			m_HCar->Run();
		}
	}
	void TurnCar(){}
	void StopCar(){}
private:
	HondaCar *m_HCar;
	FordCar *m_FCar;
};

如果在增加可用自动驾驶系统车的类型那么,要修改AutoSystem系统违反开放-封闭原则而且容易造成不必要的麻烦,这就是面向依赖进行编程带来的问题。

因此所有编程都应实现依赖抽象。通过将福特本田抽象出具体的接口针对ICar接口的编程,可以灵活扩展在扩展新的车型也非常方便。


class ICar
{
public:
	explicit ICar(){}
	virtual ~ICar(){}

	virtual void Run() = 0;
	virtual void Turn() = 0;
	virtual void Stop() = 0;
};
class HondaCar : public ICar
{
public:
    explicit HondaCar(){}
	virtual ~HondaCar(){}

	void Run(){ cout << "本田启动" <<endl;}
	void Turn(){cout << "本田转弯" <<endl;}
	void Stop(){cout << "本田停车" <<endl;}
};

class FordCar
{
public:
	explicit FordCar(){}
	virtual ~FordCar(){}

	void Run(){ cout << "福特启动" <<endl;}
	void Turn(){cout << "福特转弯" <<endl;}
	void Stop(){cout << "福特停车" <<endl;}
};

class AutoSystem
{
public:
	explicit AutoSystem(ICar *Car):m_Car(Car){}
	~AutoSystem(){}

	string m_CarType;
	void RunCar()
	{
		m_Car->Run();
	}
	void TurnCar(){}
	void StopCar(){}
private:
	ICar *m_Car;
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值