网易云课堂_C++开发入门到精通_章节8:设计模式

课时44设计模式简介

设计模式简介

面向对象设计的第一个原则:针对接口编程,而不是针对实现编程

接口->指针

实现->实例

若已存在一个类Class A,现在希望复用Class A,则有以下两种方法。

通过继承实现复用

通过组合实现复用

面向对象设计的第二个原则:优先使用对象组合,而不是类继承

课时45观察者模式

如果两个对象是松耦合的,则他们可以相互作用,但彼此的依赖性很小。

#include <iostream>
#include <assert.h>
#include <list>

class Observer
{
public:
	virtual ~Observer() = 0
	{

	}

	virtual void update(float, float, float) = 0;
};

class Subject
{
public:
	virtual ~Subject() = 0
	{

	}

	virtual void registerObserver(Observer *) = 0;
	virtual void removeObserver(Observer *) = 0;
	virtual void notifyObserver() const = 0;
};

class CurrentCondition :public Observer
{
public:
	CurrentCondition() :m_temperature(0.0), m_humidity(0.0)
	{

	}
	~CurrentCondition()
	{

	}

	void update(float temperature, float humitity, float pressure)
	{
		m_temperature = temperature;
		m_humidity = humitity;
		m_pressure = pressure;
		display();
	}
	void  display()
	{
		std::cout.setf(std::ios::showpoint);
		std::cout.precision(3);
		std::cout << "Current condition " << m_temperature;
		std::cout << "C, and " << m_humidity << "% humidity" << std::endl;
	}

private:
	float m_temperature;
	float m_humidity;
	float m_pressure;
};

class ForecastCondition :public Observer
{
public:
	ForecastCondition() :m_currentPressure(0.0), m_lastPressure(0.0)
	{

	}
	~ForecastCondition()
	{

	}

	void update(float temperature, float humitity, float pressure)
	{
		m_lastPressure = m_currentPressure;
		m_currentPressure = pressure;
		display();
	}
	void  display()
	{
		std::cout.setf(std::ios::showpoint);
		std::cout.precision(3);
		std::cout << "Current condition " << m_temperature;
		std::cout << "C, and " << m_humidity << "% humidity" << std::endl;
	}

private:
	float m_temperature;
	float m_humidity;
	float m_pressure;
	float m_lastPressure;
	float m_currentPressure;
};

class WeatherData :public Subject
{
public:
	WeatherData() :m_temperature(0.0), m_humidity(0.0), m_pressure(0.0)
	{

	}
	~WeatherData()
	{

	}

	void registerObserver(Observer *o)
	{
		assert(o);
		m_observers.push_back(o);
	}
	void removeObserver(Observer *o)
	{
		m_observers.remove(o);
	}
	void notifyObserver()const
	{
		for (std::list<Observer *>::const_iterator it = m_observers.begin(); it != m_observers.end(); ++it)
		{
			Observer *obj = *it;
			obj->update(m_temperature, m_humidity, m_pressure);
		}
	}
	void setMeasurements(float temperature, float humitity, float pressure)
	{
		m_temperature = temperature;
		m_humidity = humitity;
		m_pressure = pressure;
	}

private:
	float m_temperature;
	float m_humidity;
	float m_pressure;

	std::list<Observer*> m_observers;

private:
	WeatherData(const WeatherData&);
};

int main()
{
	CurrentCondition current;
	ForecastCondition forecast;
	WeatherData weatherdata;

	weatherdata.registerObserver(&current);
	weatherdata.registerObserver(&forecast);

	weatherdata.setMeasurements(14, 65, 30.4f);
	weatherdata.setMeasurements(19, 70, 29.2f);
	weatherdata.setMeasurements(12, 90, 29.2f);

	system("pause");

	return 0;
}

课时46策略模式

#include <iostream>
#include <assert.h>
#include <memory>

class FlyBehavior//飞的抽象类
{
public:
	virtual ~FlyBehavior() = 0
	{

	}

	virtual void fly() const = 0;
};

class FlyNoWay :public FlyBehavior//不会飞
{
public:
	void fly() const
	{
		std::cout << "I can't fly" << std::endl;
	}
};

class FlyRocketPowered :public FlyBehavior//火箭飞
{
public:
	void fly() const
	{
		std::cout << "I'm flying with a rocket" << std::endl;
	}
};

class FlyWithWings :public FlyBehavior//翅膀飞
{
public:
	void fly() const
	{
		std::cout << "I'm flying" << std::endl;
	}
};

class QuackBehavior//叫的抽象类
{
public:
	virtual ~QuackBehavior() = 0
	{

	}

	virtual void quack() const = 0;
};

class FakeQuack :public QuackBehavior//假叫
{
public:
	void quack() const
	{
		std::cout << "Qwak" << std::endl;
	}
};

class MuteQuack :public QuackBehavior//不叫
{
public:
	void quack() const
	{
		std::cout << "Silence" << std::endl;
	}
};

class Quack :public QuackBehavior//嘎
{
public:
	void quack() const
	{
		std::cout << "Quack" << std::endl;
	}
};

class Squeak :public QuackBehavior//吱
{
public:
	void quack() const
	{
		std::cout << "Squeak" << std::endl;
	}
};

class Duck//鸭的抽象类
{
public:
	void setFlyBehavior(FlyBehavior *fb)
	{
		assert(fb);
		_flyBehavior = std::auto_ptr<FlyBehavior>(fb);
	}
	void setQuackBehavior(QuackBehavior *qb)
	{
		assert(qb);
		_quackBehavior = std::auto_ptr<QuackBehavior>(qb);
	}
	void performFly() const
	{
		_flyBehavior->fly();
	}
	void performQuack() const
	{
		_quackBehavior->quack();
	}
	void swim() const
	{
		std::cout << "All ducks float, even decoys!" << std::endl;
	}
	virtual void display() const = 0;

protected:
	Duck(FlyBehavior *flyBehavior, QuackBehavior *quackBehavior) :_flyBehavior(flyBehavior), _quackBehavior(quackBehavior)
	{
		assert(flyBehavior);
		assert(quackBehavior);
	}
	virtual ~Duck()
	{

	}

private:
	std::auto_ptr<FlyBehavior>_flyBehavior;//智能指针
	std::auto_ptr<QuackBehavior>_quackBehavior;

	Duck(const Duck&);//Disable copy constructor
	void operator=(const Duck&);//Disable assignment operator
};

class DecoyDuck :public Duck//诱饵鸭
{
public:
	DecoyDuck() :Duck(new FlyNoWay(), new MuteQuack())
	{

	}

	void display() const
	{
		std::cout << "I'm a duck Decoy" << std::endl;
	}
};

class MallardDuck :public Duck//野鸭
{
public:
	MallardDuck() :Duck(new FlyWithWings(), new Quack())
	{

	}

	void display() const
	{
		std::cout << "I'm a real Mallard duck" << std::endl;
	}
};

class ModeldDuck :public Duck//假鸭
{
public:
	ModeldDuck() :Duck(new FlyNoWay(), new FakeQuack())
	{

	}

	void display() const
	{
		std::cout << "I'm a model duck" << std::endl;
	}
};

class RedHead :public Duck//红头鸭
{
public:
	RedHead() :Duck(new FlyWithWings(), new Quack())
	{

	}

	void display() const
	{
		std::cout << "I'm a real Red Head duck" << std::endl;
	}
};

class RubberDuck :public Duck//橡皮鸭
{
public:
	RubberDuck() :Duck(new FlyNoWay(), new Squeak())
	{

	}

	void display() const
	{
		std::cout << "I'm a rubber duck" << std::endl;
	}
};

int main()
{
	std::auto_ptr<MallardDuck>mallard(new MallardDuck());
	std::auto_ptr<RubberDuck>rubberduck(new RubberDuck());
	std::auto_ptr<DecoyDuck>decoy(new DecoyDuck());
	std::auto_ptr<ModeldDuck>model(new ModeldDuck());

	mallard->performFly();
	mallard->performQuack();

	rubberduck->performFly();
	rubberduck->performQuack();

	decoy->performFly();
	decoy->performQuack();

	model->performFly();
	model->performQuack();
	model->setFlyBehavior(new FlyRocketPowered());
	model->performFly();

	system("pause");

	return 0;
}
原文地址:https://www.cnblogs.com/denggelin/p/6209623.html