您的位置:首页 > 其它

《Head First 设计模式》 总结

2014-03-09 19:28 288 查看
什么是模式?
模式是在某种情景下对某些问题的解决方案。

是不是一定用上模式的代码才是好代码?
不是,用简单合适的方法解决问题。不要遇到什么问题都用必杀技,必杀技也需要酝酿的时间,如果可以一拳把对方秒杀的话,压根没必要用必杀技。

那什么时候才需要用设计模式?
设计模式不是刻意去运用的,而是遇到某个情景,触发到你的印象种的某些设计模式的条件,那么意味着用它们可以减少日后的维护成本,总的来时使用设计模式是一个很自然的过程。

《Head First 设计模式》提到的设计模式

模式描述
装饰者包装一个类,提供新的行为。
状态封装了基于状态的行为,并使用委托在行为之间切换。
迭代器在对象的集合之中游走,而不暴露集合的实现。
外观简化一群类的接口。
策略封装可以互换的行为,并使用委托来决定要使用哪一个。
代理包装对象,以控制对此对象的访问。
工厂方法由子类决定要创建的具体类是哪一个。
适配器封装对象,提供不同接口。
观察者让对象能够在状态改变时被通知。
模板方法由子类决定如何实现一个算法中的步骤。
组合客户用一致的方式处理对象集合和单个对象。
单件确保有且只有一个对象对象被创建。
抽象工厂允许创建对象的家族,而无需制定他的具体类。
命令封装请求成为对象。
Ps:下文会列举简单的例子解析。

OO基础

抽象
封装
多态
继承

OO原则

封装变化
多用组合,少用继承
针对接口编程,不针对实现编程
为交换对象之间的松耦合设计而努力
类应该对扩展开放,对修改关闭
依赖抽象,不依赖具体类
只和朋友交谈
别找我,我会找你
类应该只有一个改变的理由

个人观点: 整个设计模式的核心是为了以后更好的维护,所以设计原则 为 高内聚,低耦合 ,详细的原则,上文OO原则提到。

设计模式实例解释(非代码):

装饰者:
使用条件:给一个类提供新的行为。
平民+手枪 = 民警
民警+冲锋枪 = 特种兵
...

状态:
使用条件:行为类,存在多种状态而导致有多种行为,每次维护需要修改里面的代码(if...),所有把它的每个状态定义为一个类方便日后拓展。

行为:学习 + 说话 + ...
状态:喜怒哀乐...

状态类:
喜:好好学习 + 滔滔不绝...
怒:不想学习 + 说话很愤青...
哀:不想学习 + 沉默寡言...
乐:越学越兴奋 + 主动找人分享...

迭代器:
使用条件:给外界提供一个方法,调用它便可获取不同类的数据,外界不需要接触其底层。
A (Boss)
B (管理层)
C (底层:C1生产部,C2运输部、C3市场部...)

A需要知道底层员工的工作时间

C 的每一个类实现一个相同的方法(接口B),A 通过询问 B , 便实现对C的访问,

外观:
使用条件:定义一个高层接口,让子系统更容易使用。
包青天,手下有很多(公孙策,展昭,张龙赵虎...),办案的时候,为了方便,叫阿四(接口),而不用具体到某个人办案即可。

策略:
使用条件:封装不同的算法,使他们之间可以互换。实现:通过定义算法接口,再有不同的算法实现。

小明 要 吃饭(算法)
吃饭 = {中餐、西餐、寿司...}

代理:
使用条件:不希望外界直接访问类,需要一个辅助类作为媒介,选择性地提供信息。
邀请明星做嘉宾
宝洁公司(邀请方)—— 经纪人 —— 大明星

工厂方法:
使用条件:产品跟生产过程分开。
汉堡={麦当劳+KFC}

抽象工厂方法:
使用条件:把对象内部数据也抽象了。
汉堡 from {A工厂 + B 工厂}

汉堡 = 生菜(抽象){进口 + 国产 ...}

适配器:
使用条件:已有接口,但需要转换才能产生出目标接口。
苹果充电器->适配器->插座

观察者:
使用条件:不需要主动探测数据源是否有更新,当在数据源注册之后,数据若有更行,数据源会主动发通知过来。
老师报置作业——>学委——>学生(观察者)

模板方法:
使用条件:使用泛化的思想,把不同类中的类似方法抽象出来。
常跟迭代器组合一起运用。
各种排序算法

组合:
使用条件:让我们以树形方式创建对象的结构,以一致的方式,处理对象以及对象的组合。
列出A公司所有代理产品名称
A公司={洗发水 + 沐浴露 + B子公司}
B公司= {香水 + 洗面奶}

单件:
使用条件:确保只有只有一个对象产生。
洗手间只有一个,由所有人共享。


命令:
使用条件:把方法封装起来,通过使用一个类把相关方法封装。
一键XX,如一键刷机。

经典书籍:
《Design Patterns》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: