课时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;
}

网易云课堂_C++开发入门到精通_章节8:设计模式的更多相关文章

  1. 网易云课堂_C++开发入门到精通_章节7:模板

    课时35类模板 类模板 创建类模板的实例 class Name<类型参数表>object; 类模板与模板类的区别 类模板是模板的定义,不是一个实实在在的类,定义中用到通用类型参数 模板类是 ...

  2. 网易云课堂_C++开发入门到精通_章节6:多态

    课时33示例--为多态基类声明虚析构函数 微软校园招聘笔试题 #include <iostream> class Base { public: char Value() { return ...

  3. 网易云课堂_C++开发入门到精通_章节4:运算符重载

    课时23运算符重载 运算符重载 重载赋值运算符 Person& Person::operator=(const Person& other) { //检查自赋值 if (this == ...

  4. 网易云课堂_C++开发入门到精通_章节3: 类、对象和封装

    课时12构造函数与析构函数-2 构造函数 构造函数可以有多个 构造函数可以重载 构造函数用于隐式类型转换 class Student { public: explicit Student(int ss ...

  5. 网易云课堂_C++开发入门到精通_章节2:引用和函数的高级用法

    课时6函数重载 函数重载 在C语言头文件中的extern "C" //常见的C语言头文件格式 #ifndef _FUNC_ #define _FUNC_ #ifdef __cplu ...

  6. 网易云课堂_C++程序设计入门(上)_第6单元:丹枫虽老犹多态–继承与多态_第6单元作业【2】- 在线编程(难度:中)

    第6单元作业[2]- 在线编程(难度:中) 查看帮助 返回   温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系统 ...

  7. 网易云课堂_C++程序设计入门(上)_第1单元:C++概览_第1单元作业 - 写代码 - 互评 (难度:易)

    第1单元作业 - 写代码 - 互评 (难度:易) 查看帮助 返回   提交作业(截止时间已过) 完成并提交作业     作业批改 互评训练   互评作业   自评作业     成绩公布 查看成绩 温 ...

  8. 网易云课堂_C++程序设计入门(上)_第5单元:万类霜天竞自由 – 对象和类的更多内容_第5单元作业【4】 - 在线编程(难度:难)

    第5单元作业[4] - 在线编程(难度:难) 查看帮助 返回   温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系 ...

  9. 网易云课堂_C++程序设计入门(上)_第4单元:物以类聚 – 对象和类_第4单元作业【3】- 在线编程(难度:难)

    1 在本单元作业[1]和作业[2]的基础上,创建一个MyRectangle类,并在main函数中创建类的实例.(10分) 题目难度: 难 题目内容: Screen类: 与作业[2]要求完全相同. 如果 ...

随机推荐

  1. Hive 5、Hive 的数据类型 和 DDL Data Definition Language)

    官方帮助文档:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL Hive的数据类型 -- 扩展数据类型data_t ...

  2. hdu 5256 序列变换(LIS最长上升子序列)

    Problem Description 我们有一个数列A1,A2...An,你现在要求修改数量最少的元素,使得这个数列严格递增.其中无论是修改前还是修改后,每个元素都必须是整数. 请输出最少需要修改多 ...

  3. C# 制作 仪表

    以前在百度写的文档,转移到此处 前些天在做NetAnalyzer时,需要使用一个指针仪表,网上看了一下,也有人做过,但是大部分都是收费的,本着自力更生的原则,于是决定自己设计一个,今天拿出来有读者分享 ...

  4. 几个检查当前运行的LINUX是在VM还是在实体机中的方法

    昨天提到了VM中的逃逸问题,要想逃逸,首先要检测当前操作系统是否为VM,下面提供几个LINUX下的检查方法: 第一,首推facter virtual ,权限为普通用户,约定,普通用户命令提示符用$表示 ...

  5. 把Go程序变小的办法

    把Go程序变小的办法是: go build -ldflags “-s -w” (go install类似) -s去掉符号表(然后panic时候的stack trace就没有任何文件名/行号信息了, 这 ...

  6. 内外连接、组函数、DDL、DML和TCL

    前言 cross join ,是笛卡尔积:nature join 是自然连接. 正文 内外连接 inner join inner join 的inner能够省略. 内连接 在一个表中可以找到在还有一个 ...

  7. Unity 定时开启/关闭外部应用

    自从加入工作的队伍里,博客都荒废了,今天周末,难得清静,写篇博客!刚才看到了Process类,随手写了个小demo.给大家分享下! 首先大家要对Process类有一些简单的了解,参考资料:https: ...

  8. spring aop获取目标对象的方法对象(包括方法上的注解)

    这两天在学习权限控制模块.以前看过传智播客黎活明老师的巴巴运动网视频教程,里面就讲到权限控制的解决方案,当时也只是看看视频,没有动手实践,虽说看过几遍,可是对于系统中的权限控制还是很迷茫,所以借着这次 ...

  9. BFC,IFC,GFC,FFC的定义及功能

    What's FC?一定不是KFC,FC的全称是:Formatting Contexts,是W3C CSS2.1规范中的一个概念.它是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定 ...

  10. Ubantu 命令

    进入窗口删除文件(所有文件都可以删除) gksudo nautilus 输入法问题 ibus-daemon -drx