• 网易云课堂_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;
    }
    
  • 相关阅读:
    Android应用开发1(应用程序框架)
    使用LogParser分析网站运行情况(比较简单)
    实现支持会话的WebClient
    放大招,解决前同事签出TFS文件的问题
    Python几行代码打印出网卡的Mac地址
    飞猪传书
    QQ斗地主记牌器(只支持角色版)
    咱也搞一个TransactionScope
    自定义WinForm 下ListBox的行高
    Linq To xml 查询时需要注意的一点。
  • 原文地址:https://www.cnblogs.com/denggelin/p/6209623.html
Copyright © 2020-2023  润新知