大话设计模式 总结
作者:互联网
设计模式:让你真正学会使用面向对象进行编程
学完本书,可以再GoF的《设计模式》
附录A是面向对象的基础知识
可参考黑马程序员的视频+博客https://blog.csdn.net/weixin_42636062/category_11313224.html?spm=1001.2014.3001.5482
1.封装、继承和多态,以及简单工厂
命名要让人知道这个东西是啥,是干嘛的。
凡出现除法运算都要假设用户会输入零和字符,故要进行处理。
面向对象的编程的目的是让程序易维护(只改一小部分且不担心影响全局)、扩展(加入想要的功能且不担心影响全局;在不用把所有源码给你的条件下实现扩展)和复用。这些是通过封装、继承、多态把程序的耦合度降低实现。
封装:计算器的实现,需将计算和显示分开。即让业务逻辑和界面逻辑分开。即将业务逻辑用一个类封装好,在界面逻辑中调用它。
继承:1)将输入用set和get函数实现,并封装成一个基类A 2)每个运算都用一个类进行实现 3)简单工厂:将前面定义的类的对象都放进一个类中进行实例化。用一个switch根据输入自动选择实例化哪个运算类。
多态:由于所有的运算都继承于基类A,所以所有运算的对象都可以用基类的对象的指针a进行指向。当a调用方法B时,不同子类的方法B的实现是不一样,同样使用a->B得到的效果是不同。多态指的就是:使用相同的代码a->B却可以根据a具体指向的对象而实现出不同的效果,这个不同的效果就是多态。
利用继承和封装与直接将所有的运算实现放在一个函数中相比的好处:1)实现了易维护、扩展和复用 2)将每一个运算都用一个类进行实现,这样公司要你增加或修改一个运算类时,不需要把全部的运算都交给你,避免你把以前正确的东西瞎鸡巴改成错误的
UML类图:所有东西都总结在开头的图中了,看开头的图就行
2.策略模式
简单工厂:简单工厂仅仅指的是用一个switch根据输入自动选择实例化哪个运算类,前面定义抽象类等东西和它没有关系。
策略模式:策略模式(Strategy Pattern)定义了一组同类型的算法,在不同的类中封装起来,每种算法可以根据当前场景相互替换(指的应该就是多态),从而使算法的变化独立于使用它们的客户端(即算法的调用者)。
策略模式的内容不仅仅包括Context对Strategy对象的封装,还包括了抽象类Strategy的使用,抽象类Strategy起到了对算法的封装作用(就是抽象类普遍的作用)。父类Strategy的对象和对父类Strategy的对象的操作都封装到Context类中,Strategy的对象在类中被进行了一系列操作以后,最终利用一个函数返回算法的结果。故给Context对象中的函数传入各种各样的参数时,实际上在Context对象的内部是对Strategy对象进行操作,最后利用Strategy对象返回一个算法结果,也就是通过一个Context对象实现了向外提供统一的API。
使用Context对Strategy对象进行封装与直接使用Strategy对象的区别就是:Context对Strategy对象进行封装,对Strategy对象的操作都放在了Context中。
何时使用策略模式:一系列算法最终返回的东西是相同的(完成的工作相同),但是算法的实现过程不同。策略模式的目的就是向调用者屏蔽算法的实现过程,提供统一的API供调用者使用。只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性
简单工厂模式我需要让客户端认识两个类,CashSuper 和CashFactory,而策略模式与简单工厂结合的用法,客户端就只需要认识一个类CashContext就可以了。耦合更加降低。
3.单一职责原则(SRP), 就一个类而言,应该仅有一个引起它变化的原因。可以简单理解成类的功能单一。
4.开放-封闭原则,是说软件实体(类、模块、函数等等)应该可以扩展,但是不可修改。即不能修改,但可以扩展的思想。面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码。这里的扩展应该有两层意思,第一:子类继承父类并对父类进行扩展;第二:增加子类。
设计人员必须对于他设计的模块应该对哪种变化封闭做出选择。他必须先猜测出最有可能发生的变化种类,然后构造抽象来隔离那些变化。书中的本句话下面有例子。
拒绝不成熟的抽象和抽象本身一样重要。
5.强内聚:指类中的功能完善【我的理解】
松耦合:类间尽量互相独立【我的理解】
依赖倒转原则:编程的最开始要确定的是本程序需要向外面提供什么样的接口,以提供此接口为目的进行编程,即面向接口的编程。
高层通过统一的接口调用低层模块,低层向高层屏蔽实现的细节。如调用操作数据库的相关函数的时候, 这个函数最好是与具体的数据库无关的。
里氏代换原则:子类型必须能够替换掉它们的父类型。这样父类才能被复用,子类也能够在父类的基础上增加新的行为。
6.在软件开发过程中,有时想用一些现存的组件。这些组件可能只是完成了一些核心功能。但在不改变其结构的情况下,可以动态地扩展其功能。所有这些都可以釆用装饰器模式来实现。
其主要缺点是:装饰器模式会增加许多子类,过度使用会增加程序得复杂性。
ConcreteDecoratorX的Operation()就是先调用被装饰对象的Operation(),然后在此基础添加一些新的东西,这些新的东西就被称为装饰。
装饰类也必须继承自Component的原因:因为装饰类对象是用于装饰Component对象,而装饰类对象本身也要可以被装饰,所以装饰类对象本身也要是Component的子类,这样装饰类对象本身才可以被装饰。
定义Decorator抽象类的原因是让装饰类可以被多态地使用。
使用多个装饰类一层一层地装饰Component对象,最后的Component对象的Operation()相当于是一个包含所有装饰的函数。实际上调用最后的Component对象的Operation()后,会一层一层地往上调用被装饰对象的Operation()。
打印了啥就相当于穿了啥。
如果只有一个 ConcreteComponent类而没有抽象的Component类,那么Decorator类可是ConcreteComponent的一个子类。同样道理,如果只有一个ConcreteDecorator类,那么就没有必要建立一个单独的 Decorator类,而可以把Decorator和ConcreteDecorator的责任合并成一个类。
不影响被装饰类的同时添加额外的功能,有效地把类的核心职责和装饰功能区分开了
要保证装饰类之间彼此独立,这样它们就可以以任意的顺序进行组合了
装饰是继承关系的一个替代方案。我觉得装饰是继承的一种特殊形式。
动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。不改变接口的前提下,增强所考虑的类的性能。
何时使用:
1)需要扩展一个类的功能,或给一个类增加附加责任。
2)需要动态的给一个对象增加功能,这些功能可以再动态地撤销。
3)需要增加一些基本功能的排列组合而产生的非常大量的功能,从而使继承变得 不现实。
0.附录A
类: 类就是具有相同的属性和功能的对象的抽象的集合
对象:就是类的实例化
方法重载:相同函数名,不同形参和返回值
多态:父类对象可以用来装子类对象。C++中利用父类的指针指向子类对象。
多态例子:由于子类都重写了父类中Shout的方法,所以将子类对象装在父类对象后,通过父类对象调用Shout方法时,调用的是子类中的Shout方法。也就是父类对象中装哪个子类,调用的就是哪个子类的Shout方法,这就是多态。多态:父类对象中装哪个子类,调用的就是哪个子类的Shout方法。
重构:将相同代码都放入基类,只在子类中重写不同部分。
抽象类:实例化一只猫,我们能得到一只具体的猫。但是实例化一只动物,一只动物是什么样的?我们会发现动物不需要实例化,动物是一个抽象的概念。
故,抽象类不能实例化;抽象方法必须被子类重写;有抽象方法的类必须定义成抽象类
一般具体类不用来做继承,抽象类才用做继承。简单工厂模式中的计算器实现中,我觉得Operation就可以弄成一个抽象类,当然Operation里面可以没有抽象方法。Operation定义成抽象类,代表Operation是一个不需要具有实例化功能的类。
接口:抽象类是用来表示所有子类的共同特征和功能,而接口是给几个特殊的子类添加共同的功能。如果B和C继承接口A并各自实现了自己的a功能,那么A定义的对象就可以用来装B和C,通过A定义的对象就可以多态地访问a
C++ 接口是使用 抽象类 来实现的?????
问题:
350页???
标签:总结,父类,对象,子类,大话,Strategy,抽象类,设计模式,装饰 来源: https://www.cnblogs.com/codingbigdog/p/16558931.html