《大话设计模式》学习笔记

第一章、简单工厂模式

参考《大话设计模式》第一章简单工厂模式内容

简单工厂模式就是考虑要如何实例化对象的问题,即到底要实例化谁,将来会不会增加实例化对象。这是容易发生变化的地方,应该考虑用一个单独的类来做这个创造实例化的过程,这就是工厂类。

//简单运算工厂类
class OperationFactory {
public:
       Operation* createOperation(char operate) {
              Operation* oper = nullptr;
              switch (operate) {
              case '+':
                     oper = new OperationAdd();
                     break;
              case '-':
                     oper = new OperationSub();
                     break;
              case '*':
                     oper = new OperationMul();
                     break;
              case '/':
                     oper = new OperationDiv();
                     break;
              }
              return oper;
       }
};

在这里插入图片描述
只需要输入运算符号,工厂就会实例化出合适的对象,通过多态返回父类的方式实现计算器的结果。如果有一天需要增加其它运算,只需要增加新的运算子类然后在运算工厂类中添加对应分支即可。

第二章、策略模式

策略模式(strategy)定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户。
在这里插入图片描述

//Strategy类,定义所有支持的算法的公共接口
//抽象算法类
class Strategy {
public:
	//算法方法
	void virtual algorithmInterface();
};

//ConcreteStrategy,封装了具体的算法或行为,继承于Strategy
//具体算法A
class ConcreteStrategyA :public Strategy {
public:
	//算法A实现方法
	void algorithmInterface() {
		cout << "算法A实现" << endl;
	}
};
//具体算法B
class ConcreteStrategyB :public Strategy {
public:
	//算法B实现方法
	void algorithmInterface() {
		cout << "算法B实现" << endl;
	}
};
//具体算法C
class ConcreteStrategyC :public Strategy {
public:
	//算法C实现方法
	void algorithmInterface() {
		cout << "算法C实现" << endl;
	}
};

//Context,用一个ConcreteStrategy来配置,维护一个对Strategy对象的引用
//上下文
class Context {
public:
	//初始化时,传入具体的策略对象
	Context(Strategy strategy) {
		this.strategy = strategy;
	}
	//上下文接口
	//根据具体的策略对象,调用其算法的方法
	void contextInterface() {
		strategy.algorithmInterface();
	}
private:
	Strategy strategy;
};

//客户端代码
void main() {
	Context* context;
	//由于实例化不同的策略,所以在调用context.contextInterface()时,所获得的结果就不同
	context = new Context(new ConcreteStrategyA());
	context.contextInterface();

	context = new Context(new ConcreteStrategyB());
	context.contextInterface();

	context = new Context(new ConcreteStrategyC());
	context.contextInterface();
}
  • 策略模式是一种定义一系列算法的方法,从概念上看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。
  • 策略模式的Strategy类层次为Context定义了一系列的可供重用的算法或行为,继承有助于析取出这些算法中的公共功能。
  • 策略模式简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。
  • 策略模式就是用来封装算法的,但在实际中,我们发现可以用它来封装几乎所有类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。
  • 在基本的策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的Context对象。

第三章、单一职责原则

单一职责原则:就一个类而言,应该仅有一个引起它变化的原因。

软件设计真正要做的许多内容,就是发现职责并把那些职责相互分离。如何去判断是否需要分离出类来,那就是如果能够想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责,就应该考虑类的职责分离。

第四章、开放-封闭原则

开放-封闭原则:是说软件实体(类、模块、函数等)应该可以扩展,但是不能修改。即对于扩展是开放的,对于修改是封闭的。设计软件要容易维护又不容易出问题的最好办法,就是多扩展少修改。
开放-封闭原则的意思就是说,在设计的时候,要时刻考虑,尽量让这个类足够好,写好了就不要去修改,如果新需求来,我们增加一些类就完事了,原来的代码能不动就不动。面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有代码。

  • 开放-封闭原则使得设计面对需求的改变可以保持相对稳定,从而使系统可以在第一个版本以后不断推出新的版本。
  • 无论模块是多么“封闭”,都会存在一些无法对之封闭的变化。既然不可能完全封闭,设计人员必须对于他设计的模块应该对哪种变化封闭做出选择。必须先猜测出最有可能发生变化的变化种类,然后构造抽象类来隔绝那些变化。
  • 由于很难事先猜测,但是却可以在发生小变化时,及早想办法应对大变化发生的可能。在我们最初编写代码时,假设变化不会发生。当变化发生后,我们就创建抽象类来隔离以后发生的同类变化。
  • 我们希望的是在开发工作开展不久就知道可能发生的变化,查明可能发生的变化所等待的时间越长,要创建正确的抽象就越困难。
  • 开放-封闭原则是面向对象的核心,遵循这个原则可以带来面向对象技术所声称的巨大好处,也就是可维护、可扩展、可复用、灵活性好。开发人员应该仅对程序中呈现出频繁变化的那些部分作出抽象,然而对于应用程序中的每个部分都刻意地进行抽象同样不是一个好主意,拒绝不成熟的抽象和抽象本身同样重要。

第五章 依赖倒转原则

依赖倒转原则 :a.高层模块不应该依赖低层模块,两个都应该依赖抽象。b.抽象不应该依赖细节,细节应该依赖抽象。
里氏代换原则:子类必须能够替换掉它们的父类型。例如,一个鸟类,一个企鹅类,如果鸟类可以飞,而企鹅不会飞,那么企鹅类不能继承鸟类。

  • 只有当子类能够替换掉父类,软件单位的功能不受到影响时,父类才能真正被复用,而子类也能够在父类的基础上增加新的行为。
  • 正是由于子类型的可替换性才使得使用父类型的模块在无需修改的情况下就可以扩展。
  • 依赖倒转其实可以说是面向对象设计的标志,用哪种语言来编写程序不重要,如果编写时考虑的都是如何针对抽象编程而不是针对细节编程,即程序中所有的依赖关系都是终止于抽象类或者接口,那就是面向对象的设计,反之就是面向过程的设计。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值