用模式思考(什么情况下用模式,什么情况下不用模式)
保持简单(用最简单的方法去解决问题。)
要知道何时需要模式……
重构时间就是模式时间
拿掉你所不需要的,不要害怕一个模式充你的设计中删除
如果你现在不需要,就别做。
反模式
:告诉你采用一个不好的解决方案解决一个问题。
云认知:你想怎么才能骗过自己的大脑,让我的大脑记住。把自己的神经点火。
怎么样让自己的大脑就范:
1.慢一点,你看的越多,记住的越少。时不时的停下来,深深的思考一番。
2.勤做练习题,做笔记。
3.上床睡觉前千万别看难懂的书或者学习难懂的知识。随便读。
4.要喝水,多喝水。
5.大声的说出来吧。
6.听听你的大脑怎么说吧:感觉自己的大脑动不起来时,应该休息休息了。
7.要有感觉。
9.设计一些东西。
head first的学习原则:
1.看得到(图,视频加文字)
2.采用一种针对个人的交谈方式
3.让学习的人想的更深
4.引起我的注意,并且一直注意下去
5.影响我的情绪
雷军:
建议一、只有真正喜欢才能写好程序
建议二、把程序当艺术品,象写诗一样来写代码
建议三、必须写够十万行代码,不要心存侥幸
建议四、时刻保持好奇心
建议五、不要局限在技术本身,多花点精力关注用户
OO基础
:抽象、封装、继承、多态
OO原则
:
- 封装变化——找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起。
- 多组合,少用继承。
- 为了交互对象的松耦合设计而努力。
- 对扩展开放,对修改关闭(我想这是相对于类来说的)
- 依赖抽象,不依赖具体类
- 最少知识原则:只和你的密友谈话
有一个和是一个的意思:有一个可能是某个抽象类中有一个接口,是一个可能是某个类继承了某个抽象类。
有一个可能比是一个更好。
代码重用(继承),提高维护性和可扩展性。
OO模式
:
创建型——
Singleton(单例模式)
:
名称 |
Singleton
|
结构 |
|
意图 |
保证一个类仅有一个实例,并提供一个访问它的全局访问点。 |
适用性 |
- 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
- 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
|
创建型——FactoryMethod(工厂方法)
:定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。
名称 |
Factory Method
|
结构 |
|
意图 |
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。 |
适用性 |
- 当一个类不知道它所必须创建的对象的类的时候。
- 当一个类希望由它的子类来指定它所创建的对象的时候。
- 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
|
创建型——Abstract Factory(抽象工厂)
:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
举例说明:
产生鸭子的抽象工厂,这些鸭子都继承同一个接口(Quackable)
public interface Quackable {
public void quack();
}
public abstract class AbstractDuckFactory {
public abstract Quackable createMallardDuck();
public abstract Quackable createRedheadDuck();
public abstract Quackable createDuckCall();
public abstract Quackable createRubberDuck();
}
public class CountingDuckFactory extends AbstractDuckFactory {
public Quackable createMallardDuck() {
return new QuackCounter(new MallardDuck());
}
public Quackable createRedheadDuck() {
return new QuackCounter(new RedheadDuck());
}
public Quackable createDuckCall() {
return new QuackCounter(new DuckCall());
}
public Quackable createRubberDuck() {
return new QuackCounter(new RubberDuck());
}
}
AbstractDuckFactory duckFactory = new CountingDuckFactory();
名称 |
Abstract Factory
|
结构 |
|
意图 |
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 |
适用性 |
- 一个系统要独立于它的产品的创建、组合和表示时。
- 一个系统要由多个产品系列中的一个来配置时。
- 当你要强调一系列相关的产品对象的设计以便进行联合使用时。
- 当你提供一个产品类库,而只想显示它们的接口而不是实现时。
|
行为型——
Strategy
策略模式
:对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类.
比喻:鸭子类中鸭子们可能会飞,也可能不会飞,所以就不能不飞放在鸭子里,将其对立开来。
名称 |
Strategy
|
结构 |
|
意图 |
定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。 |
适用性 |
- 许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。
- 需要使用一个算法的不同变体。例如,你可能会定义一些反映不同的空间/时间权衡的算法。当这些变体实现为一个算法的类层次时[ H O 8 7 ]
,可以使用策略模式。
- 算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
- 一个类定义了多种行为, 并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的S t r a t e g y
类中以代替这些条件语句。
|
通俗理解:
策略模式:策略,顾名思义,就是面对客户的需求或者是未来的需求,但有些需求是可以大概预测的,但是也有我们
未知的变化,但是一般情况下这个变化是可以限定的。比如鸟儿会叫,但是不一定每个都会叫,这是一种行为,可以
有很多种叫法。所以我们用策略模式来解决他。
行为型——observer(观察者模式
):
定义了对象之间的一对多依赖关系,这时,当一个对象改变状态时,他的所有依赖着就会收到通知并更新。
比喻:猎头+程序员 = 观察者模式 出版社+订阅者 = 观察者模式,一对多的关系,一个是带有状态的主题,其他是
使用这个主题的使用者
Observer
|
结构 |
|
意图 |
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。 |
适用性 |
- 当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
- 当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。
- 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。
|
设计原理:为了交互对象的松耦合设计而努力。
结构型——Decorator(装饰者模式)
比喻:咖啡店里卖咖啡,咖啡杯是被装饰者,咖啡、糖、摩卡等为装饰着。
名称 |
Decorator
|
结构 |
|
意图 |
动态地给一个对象添加一些额外的职责。就增加功能来说,D e c o r a t o r 模式相比生成子类更为灵活。 |
适用性 |
- 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
- 处理那些可以撤消的职责。
- 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
|
结构型——COMMAND(命令模式)
名称 |
Command
|
结构 |
|
意图 |
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。 |
适用性 |
- 抽象出待执行的动作以参数化某对象,你可用过程语言中的回调(c a l l b a c k
)函数表达这种参数化机制。所谓回调函数是指函数先在某处注册,而它将在稍后某个需要的时候被调用。C o m m a n d 模式是回调机制的一个面向对象的替代品。
- 在不同的时刻指定、排列和执行请求。一个C o m m a n d
对象可以有一个与初始请求无关的生存期。如果一个请求的接收者可用一种与地址空间无关的方式表达,那么就可将负责该请求的命令对象传送给另一个不同的进程并在那儿实现该请求。
- 支持取消操作。C o m m a n d 的E x c u t e 操作可在实施操作前将状态存储起来,在取消操作时这个状态用来消除该操作的影响。C o
m m a n d 接口必须添加一个U n e x e c u t e 操作,该操作取消上一次E x e c u t e
调用的效果。执行的命令被存储在一个历史列表中。可通过向后和向前遍历这一列表并分别调用U n e x e c u t e 和E x e c u t e
来实现重数不限的“取消”和“重做”。
- 支持修改日志,这样当系统崩溃时,这些修改可以被重做一遍。在C o m m a n d
接口中添加装载操作和存储操作,可以用来保持变动的一个一致的修改日志。从崩溃中恢复的过程包括从磁盘中重新读入记录下来的命令并用E x e c u t e
操作重新执行它们。
- 用构建在原语操作上的高层操作构造一个系统。这样一种结构在支持事务( t r a n s a c t i o n
)的信息系统中很常见。一个事务封装了对数据的一组变动。C o m m a n d 模式提供了对事务进行建模的方法。C o m m a n d
有一个公共的接口,使得你可以用同一种方式调用所有的事务。同时使用该模式也易于添加新事务以扩展系统。
|
结构型——Adapter(_class,_object)适配器
比如:一个美国带回来的电脑,中国的插头不是和它用,这是就要有个适配器来转换电源。
名称 |
Adapter
|
结构 |
|
意图 |
将一个类的接口转换成客户希望的另外一个接口。A d a p t e r
模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 |
适用性 |
- 你想使用一个已经存在的类,而它的接口不符合你的需求。
- 你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
- (仅适用于对象A d a p t e r )你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。
|
结构型——Facade
(外观模式)
比喻:一堆零散的个体,比如音箱、DVD、液晶电视……,我如果要看家庭影院,就需要一个一个的将他们开启来,
我的家庭影院才可以开始,这是我们就可以想象我们的模式中,外观模式非常适合。
名称 |
Facade
|
结构 |
|
意图 |
为子系统中的一组接口提供一个一致的界面,F a c a d e 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 |
适用性 |
- 当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。F
a c a d e 可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过f a c a d e 层。
- 客户程序与抽象类的实现部分之间存在着很大的依赖性。引入f a c a d e 将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。
- 当你需要构建一个层次结构的子系统时,使用f a c a d e 模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,你可以让它们仅通过f a c
a d e 进行通讯,从而简化了它们之间的依赖关系。
|
行为型:Template Method(模板方法)
设计原则:别找我,我会找你。
例子:咖啡和茶的制作步骤,这里的步骤就可以作为模板方法。
设计模式迷你手册 ---- RedSword软件工作室
名称 |
Template Method
|
结构 |
|
意图 |
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Te m p l a t e M e t h o d
使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 |
适用性 |
- 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
- 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。这是O p d y k e 和J o h n s o n
所描述过的“重分解以一般化”的一个很好的例子[ O J 9 3
]。首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。
- 控制子类扩展。模板方法只在特定点调用“h o o k ”操作(参见效果一节),这样就只允许在这些点进行扩展。
|
- 大小: 3.2 KB
- 大小: 4.3 KB
- 大小: 3.2 KB
- 大小: 3.2 KB
- 大小: 4 KB
分享到:
相关推荐
《C#设计模式》作为一本面向C#程序员的设计模式专著,不仅仅提供了对设计模式的理论阐述,更重要的是,它通过对39个不同设计模式的深入分析,配合大量实例和思考题,帮助读者在实践中理解并掌握这些模式的应用。...
学习设计模式并非易事,需要一定的技巧才能让大脑接受并记住这些复杂的概念。本书通过有趣且易于理解的例子来解释每一种模式,旨在让读者轻松掌握这些知识而不感到枯燥乏味。 #### 技术评审者 为了确保内容的准确...
主要内容为:优化代码的首步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、单例模式、Builder模式、原型模式、工厂方法模式、抽象工厂模式、策略模式、状态模式、责任链模式、解释器模式、...
本书的主要内容为:优化代码的第一步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、单例模式、Builder模式、原型模式、工厂方法模式、抽象工厂模式、策略模式、状态模式、责任链模式、解释器...
主要内容为:优化代码的首步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、单例模式、Builder模式、原型模式、工厂方法模式、抽象工厂模式、策略模式、状态模式、责任链模式、解释器模式、...
主要内容为:优化代码的首步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、单例模式、Builder模式、原型模式、工厂方法模式、抽象工厂模式、策略模式、状态模式、责任链模式、解释器模式、...
本书的主要内容为:优化代码的第 一步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、单例模式、Builder模式、原型模式、工厂方法模式、抽象工厂模式、策略模式、状态模式、责任链模式、解释器...
本书的主要内容为:优化代码的第一步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、单例模式、Builder模式、原型模式、工厂方法模式、抽象工厂模式、策略模式、状态模式、责任链模式、解释器...
在IT行业中,设计模式是软件开发中的重要概念,它代表了在特定情境下解决...在阅读《设计模式--Java语言版本》时,读者应结合具体代码示例,深入理解每种模式的精髓,并尝试在自己的项目中运用,以达到学以致用的目的。
学以致用•深入浅出数字信号处理 学以致用•深入浅出数字信号处理
本文探讨了在数据结构课程中实施基于产品设计模式的实践教学方法,旨在通过将数据结构视为产品进行设计和使用,提高教学效果,具体阐述了这种模式的含义、特点、主要数据结构产品设计以及实施案例。 在教育领域,...
为了自己能够系统有效地学习设计模式,也希望能够帮助到其他想对设计模式有了解的同学,我边学习边做了这个系列的设计模式笔记。 本系列主要由Java语言来实现。内容来自国外网站,并结合了其他相关内容,如阎宏博士...
《PowerPoint 2013设计与制作-学以致用系列》是一份全面介绍PowerPoint 2013软件设计和制作技巧的教学资料。这份压缩包涵盖了从基础操作到高级应用的各种主题,旨在帮助用户提升幻灯片制作的技能,以实现更专业、更...
《OpenOffice 学以致用 中文版》是针对OpenOffice这款开源办公软件的一份详尽教程,旨在帮助用户深入理解和高效应用。OpenOffice是全球广泛使用的免费办公套件,包括了文字处理、电子表格、演示文稿、绘图、数据库等...
本资源摘要信息是根据小学一年级道德与法治课程的教学设计《让我自己来整理》来说课稿,旨在培养学生的整理习惯和自理能力。以下是本资源摘要信息的知识点总结: 一、教学目标: * 懂得自己的事情要自己做,不会的...
在“Glade编程(学以致用).pdf”这个文件中,可能包含了如下内容: 1. Glade的基础使用:如何启动Glade,创建新的项目,添加控件到界面上,以及调整其属性。 2. GTK+控件介绍:讲解GTK+提供的各种控件,如按钮、文本...
ARM进阶两步走学以致用.pdf
本文的价值不在于介绍几个进阶的模式,而在于教您如何有样学样,无样自己想,举一反三,创造出无限的新模式。换句话说,本文的用意不在于钓几条鱼(模式)给您吃,而在于教您应变能力,能在不同湖泊或大海中皆能...