《大话设计模式》1-9章学习笔记

学习设计模式
03.08
1.简单工厂模式
背景:做计算器
这里写图片描述
简单工厂模式的意义为将计算器的不同计算方式分离(业务封装)

2.策略模式
背景:商场促销
这里写图片描述
策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。
–策略模式的Strategy类层次为Context定义了一系列可供重用的算法或行为。继承有助于析取出这些算法中的公共功能。
–策略模式的优点就是简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。
–当不同的行为堆砌在一个类中时,就很难避免使用条件语句来选择合适的行为。将这些行为封装在一个个独立的Strategy类中,可以在使用这些行为的类中消除条件语句。
这是策略模式与工厂模式的结合。
–策略模式就是用来封装算法的,但在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性
–在基本的策略模式中,选择选用具体实现的职责由客户端对象承担,并转给策略模式的Context对象。这本身并没有解除客户端需要选择判断的压力。而策略模式与简单工厂模式结合后,选择具体实现的职责也可以由Context来承担,这就最大化地减轻了客户端的职责。

03.12
3.单一职责原则
背景:手机功能
单一职责原则(srp):就一个类而言,应该仅有一个引起他变化的原因。
–软件设计真正要做的许多内容,就是发现职责并把那些职责相互分离。
如果你能够想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责,就应该考虑类的职责分离

4.开放-封闭原则
背景:一国两制、考研与求职
开放-封闭原则:是说软件实体(类、模块、函数等等)应该可以扩展,但是不可修改。
–对于扩展是开放的,对于更改是封闭的。
–针对问题:怎样的设计才能面对需求的改变却可以保持相对稳定,从而使得系统可以在第一个版本以后不断推出新的版本呢?
–无论模块是多么的‘封闭’,都会存在一些无法对之封闭的变化。既然不可能完全封闭,设计人员必须对于他设计的模块应该对哪种变化封闭做出选择。他必须先猜测出最有可能发生的变化种类,然后构造抽象来隔离那些变化。
–等到变化发生时立即采取行动。
–在我们最初编写代码时,假设变化不会发生。当变化发生时,我们就创建抽象来隔离以后发生的同类变化。
–面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码。

这里写图片描述
–我们希望的是在开发工作展开不久就知道可能发生的变化。查明可能发生的变化锁等待的时间越长,要创建正确的抽象就越困难。(举例:如果加减运算都在很多地方应用了,再考虑抽象、考虑分离,就很困难。)
–开放-封闭原则是面向对象设计的核心所在。遵循这个原则可以带来面向对象技术所声称的巨大好处。也就是可维护、可扩展、可复用、灵活性好。开发人员应该仅对程序中呈现出频繁变化的那些部分做出抽象。然而,对于应用程序中的每个部分都刻意地进行抽象同样不是一个好主意。拒绝不成熟的抽象和抽象本身一样重要。

5.依赖倒转原则
背景:会修电脑不会修收音机
–抽象不应该依赖细节,细节颖依赖于抽象。针对借口编程,不要对实现编程。(举例:如果针对实现,那么内存就要对应到具体的某个品牌的主板,那更换内存只能更换同品牌的内存)
A.高层模块不应该依赖低层模块。两个都应该依赖抽象。
B.抽象不应该依赖细节。细节应该依赖抽象。
{
5.2里氏代换原则
背景:企鹅不能继承鸟
一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出父类对象和子类对象的区别。也就是说,在软件里面,把父类都替换成它的子类,程序的行为没有变化。简单地说,子类型必须能够替换掉它们的父类型。
–只有当子类可以替换掉父类,软件单位的功能不受到影响时,父类才能真正被复用,而子类也能够在父类的基础上增加新的行为。
–由于子类型的可替换性才使得使用父类类型的模块在无需修改的情况下就可以扩展。
这里写图片描述
(谁都不依靠谁,除了约定的借口,大家都可以灵活自如)
}
–依赖倒转其实可以说是面向对象设计的标志,用哪种语言来编写程序不重要,如果编写时考虑的都是如何针对抽象编程而不是针对细节编程,即程序中所有的依赖关系都是终止于抽象类或者接口,那就是面向对象的设计,反之那就是过程化的设计了。

03.13
6.装饰模式
–装饰模式,动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
这里写图片描述
–Component是定义一个对象借口,可以给这些对象动态地添加职责。ConcreateComponent是定义了一个具体的对象,也可以给这个对象添加一些职责。Decorator,装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator的存在的。至于ConcreateDecorator就是具体的装饰对象,起到给Component添加职责的功能。
–装饰模式是利用SetComponent来对对象进行包装的。这样每个装饰对象的实现就和如何使用这个对象分离开了,每个装饰对象只关心自己的功能,不需要关系如何被添加到对象链当中。
–如果只有一个Component类而没有抽象的Component类,那么Decorator类可以是ConcreateComponent的一个子类。同样道理,如果只有一个ConcreateDecorator类,那么就没有必要建立一个单独的Decorator类,而可以把Decorator和Concreate和ConcreateSecorator的责任合并成一个类。
–装饰模式是为已有功能动态地添加更多功能的一种方式。当系统需要新功能的时候,是向旧的类中添加新的代码。这些新加的代码通常装饰了原有类的核心职责或主要行为,(比如用西装或嘻哈服来装饰小菜,但这种做法的问题在于,它们)在主类中加入了新的字段,新的方法和新的洛基,从而增加了主类的复杂度,(就像你起初的那个‘人’类,)而这些新加入的东西仅仅是为了满足一些只在某种特定情况下才会执行的特殊行为的需要。而装饰模式却提供了一个非常好的解决方案,他把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择地、按顺序地使用装饰功能包装对象了。
–装饰模式的优点:把类中的装饰功能从类中搬移去除,这样可以简化原有的类。有效地把类的核心职责和装饰功能区分开了。而且可以去除相关类中重复的装饰逻辑。

03.14
7.代理模式
背景:代送礼物
代理模式,为其他对象提供一种代理以控制对这个对象的访问。
这里写图片描述
-代理模式的应用。1.远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。2.虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。(网页加载)3.安全代理,用来控制真实对象访问时的权限。一般用于对象应该有不同的访问权限的时候。4.智能指引,是指当调用真实的对象时,代理处理另外一些事。

8.工厂方法
背景:学习雷锋
–简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
这里写图片描述
–工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来运行。你想要加功能,本来是改工厂类的,而现在是修改客户端。

9.原型模式
背景:简历的复制
原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
这里写图片描述
–原型模式其实就是从一个对象再创建另一个可定制的对象,而且不需知道任何创建的细节。
–一般在初始化的信息不发生变化的情况下,克隆是最好的办法。这既隐藏了对象创建的细节,又对性能是大大的提高。
–不用重新初始化对象,而是动态地获得对象运行时的状态。
–‘浅复制’,被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。深复制把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值