现代软件设计特征:需求频繁变化

设计模式的要点是“寻找变化点”,在变化点应用设计模式,从而更好的应对需求变化。

1、 Template Method

在软件构建结构中,往往他有整体的稳定结构,但是各个子步骤确有变化的需求,或者因为固有的原因(比如框架和应用之间)而无法和任务的整体结构同时实现。

这个时候往往使用Template Method方法。

定义一个操作中算法的骨架(稳定),而将一些步骤延迟(变化)到子类(父类定义虚函数,在子类中具体实现)。使得子类可以不改变(复用)一个算法的结构即

可重定义override该算法的某些特定步骤。让框架调用应用程序而不是应用程序调用框架。“不要调用我让我来调用你”,晚绑定和早绑定的区别。

UML类图:

代码实例:


class Library {//稳定的数据结构,不会发生改变
public:
void step1() {}
int step2() { return contrl;}
void virtual step3() {}
void step4() {}
void virtual step5() {} void run() {
step1();
if(step2()) {
step3();
}
else {
step5();
} for(int i = 10; i < 100; ++i) {
step4();
}
} virtual ~Library() {}; std::string name = "myname";
}; class Application1 : public Library {// 承载着不断变化的需求
public:
void step3() override { std::cout << this->name << std::endl; }
void step5() override { std::cout << this->Library::name << std::endl; }
std:: string name = "Application";
}; class Application2 : public Library {// 承载者不断变化的需求
public:
void step3() override {}
void step5() override {}
}; int main() {
Library *a = new Application1;
a->run();
delete a;
return 0;
}

2、 策略模式(Strategy)

在软件构建的过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中去,将会使得对象变得异常复杂,而且有时候支持几乎不使用的算法也是一种性能负担。

问题:如何在运行的时候根据需要透明的改变算法? 将算法与对象本身解耦合,从而避免上述问题?
定义:定义一系列算法,将他们一个个封装起来,而且他们可以相互替换(变化)。该模式使得算法可以独立于使用他们的应用程序(稳定)而变化(扩张,子类化)

UML类图:

代码实例:

class Strategy {
public:
virtual int doOperation(int num1, int num2) {} // 基类中需要改写的方法
virtual ~Strategy(){}
}; class plus final : public Strategy {// 不同的策略
public:
int doOperation(int num1, int num2) {
return num1 + num2;
}
}; class multipl final : public Strategy {
public:
int doOperation(int num1, int num2) {
return num1 * num2;
}
}; class minus final : public Strategy {
public:
int doOperation(int num1, int num2) {
return num1 - num2;
}
}; class Context { //封装调用接口
public:
Context(Strategy *init) :stra(init) {}
int run(int num1, int num2) {
return this->stra->doOperation(num1, num2);
}
private:
Strategy *stra;
}; int main() {
Context demo(new multipl);
std::cout << demo.run(10, 20) << std::endl; //使用调用接口中的基类指针多态的执行。
return 0;
}

3、 观察者模式(Observer)

一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。

一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。

一个对象必须通知其他对象,而并不知道这些对象是谁。

定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

UML类图:

代码示例:

enum class msg {
RETURN1,
RETURN2,
RETURN3
}; class Observer {
public:
void virtual update(msg ms) = 0;
}; class ob1 : public Observer {
public:
void update(msg ms) {
switch(ms) {
case msg::RETURN1 :
case msg::RETURN2 :
case msg::RETURN3 :
std::cout << "RETURN1" << std::endl;
default:
std::cout << "right" << std::endl;
}
}
}; class ob2 : public Observer {
public:
void update(msg ms) {
switch(ms) {
case msg::RETURN1 :
case msg::RETURN2 :
case msg::RETURN3 : {
std::cout << "RETURN2" << std::endl;
break;
}
default:
std::cout << "erro ms2" << std::endl;
}
}
}; class ob3 : public Observer {
public:
void update(msg ms) {
switch(ms) {
case msg::RETURN1 :
case msg::RETURN2 :
case msg::RETURN3 : {
std::cout << "RETURN3" << std::endl;
break;
}
default:
std::cout << "erro ms3" << std::endl;
}
}
}; class subject {
public:
void addob(Observer *ob) { obs.insert(ob);}
void removeob(Observer *ob) {
auto rob = obs.find(ob);
if(rob != obs.end()){
obs.erase(ob);
}
else std::cout << "erro no matching observer" << std::endl;
}
void update() {
for(auto& ob : obs) {
ob->update(ms);
}
} msg ms;
std::set<Observer*> obs;
}; int main() {
Observer *ob_1 = new ob1;
Observer *ob_2 = new ob2;
Observer *ob_3 = new ob3;
subject *sub = new subject;
sub->ms = msg::RETURN1;
sub->addob(ob_1);
sub->addob(ob_2);
sub->addob(ob_3);
sub->update();
return 0;
}

observer:变化尽量通过调用方的多态机制,传递给被调用方,决定如何调用。

C++ 设计模式--模板模式、策略模式、观察者模式的更多相关文章

  1. 【转】设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成 ...

  2. 设计模式:Strategy 策略模式 -- 行为型

    设计模式 策略模式Strategy(对象行为型) 这是几年前写的文字(转载做的笔记更准确些),发觉还是废话多了点. 其实,核心就是5.结构中的UML图 5.1 和 5.2(新增).现在看这张图就觉得一 ...

  3. 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...

  4. 设计模式浅谈----策略模式(c#及java实现)

    一.何为策略模式 策略模式是行为型模式的一种,主要用于需要使用不同的算法来处理不同的数据对象时使用,是一种可以在运行时选择算法的设计模式.也称为政策模式. 主要解决:在有多种算法相似的情况下,使用 i ...

  5. 《Head First 设计模式》[01] 策略模式

    <Head First 设计模式>(点击查看详情) 1.写在前面的话 之前在列书单的时候,看网友对于设计模式的推荐里说,设计模式的书类别都大同小异,于是自己就选择了Head First系列 ...

  6. 大话设计模式Python实现-策略模式

    策略模式(Strategy Pattern):它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户. 下面是一个商场活动的实现 #!/usr/bin/e ...

  7. javascript设计模式--策略模式

    javascript策略模式总结 1.什么是策略模式? 策略模式的定义是:定义一系列的算法,把他们独立封装起来,并且可以相互替换. 例如我们需要写一段代码来计算员工的奖金.当绩效为a时,奖金为工资的5 ...

  8. [head first 设计模式] 第一章 策略模式

    [head first 设计模式] 第一章 策略模式 让我们先从一个简单的鸭子模拟器开始讲起. 假设有个简单的鸭子模拟器,游戏中会出现各种鸭子,此系统的原始设计如下,设计了一个鸭子超类,并让各种鸭子继 ...

  9. Python设计模式: 最佳的"策略"模式实践代码

    Python设计模式: 最佳的"策略"模式实践代码 今天抽空看了下流畅的python,发现里面介绍了不少python自带的库的使用实例,用起来非常的优雅. 平时用Python来写爬 ...

  10. Java设计模式6:策略模式

    策略模式 策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化. 策略模式的结构 策略模式是对算法的包 ...

随机推荐

  1. 虚拟主机和ECS的选择——有的坑你可以不躺,有的钱你可以不花(一)

    一直想做网站,由于最开始虚拟主机有优惠,所以三年前买了虚拟主机,后来一直续费,间歇性使用过,发现很多功能都不行​. 昨天准备买新的,然后想起学生购买有优惠,于是开始了学生认证之旅​. 首先,看一下之前 ...

  2. 霍夫曼编码(Huffman)

    题目:有一个字符串:cabcedeacacdeddaaaba,问题: (1)采用霍夫曼编码画出编码的过程,并写出各字符的编码 (2)根据求得的编码,求得各编码需要的总位数 (3)求出整个字符串总编码长 ...

  3. linux(centos8):禁用selinux(临时关闭/永久关闭)

    一,selinux的用途 1,什么是selinux SELinux:即安全增强型 Linux(Security-Enhanced Linux) 它是一个 Linux 内核模块,也是 Linux 的一个 ...

  4. linux 压缩命令 zip

    1.zip命令 例如:zip -r mysql.zip mysql 该句命令的含义是:将mysql文件夹压缩成mysql.zip zip -r abcdef.zip abc def.txt 这句命令的 ...

  5. visio2016激活 试用版

    输入秘钥: W9WC2-JN9W2-H4CBV-24QR7-M4HB8   可以成功激活成试用版 有效期30天,30天之后需要你正式激活! 经本人使用完全可以激活,欢迎大家使用!   也欢迎大家支持正 ...

  6. oracle sql developer 启动java.exe设置错误

    1.找到oracle安装目录下的jdk,如:E:\app\Administrator\product\11.2.0\dbhome_1\jdk 2.找到oracle安装目录下的developer路径:E ...

  7. Java学习的第五天

    1.值域转化的规则:值域小的类型可以自动转化成值域大的类型,值域大的类型可以强行转化成值域小的类型,但要注意精度,除了基本类型可以转换,引用类型之间也可以转换. 引用类型可以是类,借口,数组. 常见的 ...

  8. SPOJ16607 IE1 - Sweets

    题面 传送门: 洛咕 SPOJ Solution 这题的想法挺妙的. . 首先,对于这种区间求答案的问题,我们一般都可以通过类似前缀和的思想一减来消去a,即求[a,b]的答案可以转化为求[1,b]-[ ...

  9. XX-Net 解决IPV6 不稳定,时好时坏。

    一.启动IPV6 1.重置: netsh interface Teredo set state disable netsh interface Teredo set state type=defaul ...

  10. 计算机网络-DHCP协议抓包分析总结

    前置问题:什么是(网络)协议? 网络协议为计算机网络中进行数据交换而建立的规则.标准或约定的集合. 而且: 一个网络协议至少包括三要素: 语法:用来规定信息格式;数据及控制信息的格式.编码及信号电平等 ...