设计模式
来源:互联网 发布:sql server 聚合 编辑:程序博客网 时间:2024/06/07 04:57
这两天面试被问到设计模式,发现自己大概从13年起也就不执着于根据设计模式来设计程序,虽然一直在用,但突兀问起有的记得,有的确也是记不太清了。趁此机会来回顾下,先推荐本书,个人感觉适合初学者,记忆会比较深刻《大话设计模式》,不过学会了还是看看经典吧~
还有篇博文,相当不错,对于每个设计模式都给出了示例之类的:
http://terrylee.cnblogs.com/archive/2006/06/01/334911.html
闲话少说,下面我就根据自己的理解来给你简单聊聊设计模式,时间有限,就不面面俱到,也就聊些常用的,如有不足还请批评指正。
1. 单例模式
这个因为太过不起眼,很容易令人遗忘,比如笔者就是想了半天还是觉得不会那么简单而放弃了,其实它真得很简单。
啥叫单例?顾名思义,就是指一个类或者对象有且仅有一个实例,有点类似于静态全局变量,用大白话来说,每个个体都是独一无二的,无法复制与克隆,就是这么简单。
2.简单工厂模式
个人认为这个模式实在太过普遍,乃是面向对象设计中的基础,何为简单工厂,举一个很简单的例子:
比如商场打折促销搞活动,不同的商家自然促销方式不同,假设有:
① 商品8折
② 特殊商品5折
③ 满99减45
……
诸如此类,我们可以将这些统称为打折策略。
如何灵活应用打折策略?那就是简单工厂的作用了。
我们定义一个抽象类叫做收费,随后对于不同的打折策略都以收费为基类,重写它们的具体方法,最为重要的是,我们仅在工厂中对它们进行有针对性的调用,以此来降低耦合度,使得复用性和维护性更好。
//抽象类abstract class 收费{ public abstract double 计算总价(double money);}//针对不同的打折方式的具体实现class 打八折: 收费{ public override double 计算总价(double money) { //具体计算流程 return money; }}class 满99减45: 收费{ public override double 计算总价(double money) { //具体计算流程 return money; }}...//工厂类class 收费工厂{ public static 收费 create(string str) { 收费 oper = null; switch (str) { case "打八折" : oper = new 打八折(xx); break; case "满99减45" : oper = new 满99减45(xx); break; …… } return oper; }}}客户端调用就省略了,其实就是创建工厂类调用抽象类即可。
就和上面所说,我们用工厂封装了所有的打折策略,这就是简单工厂,注意:不是工厂模式哦~
3. 策略模式
还是依着上面的例子来说,打折是种策略,因而可以用策略模式(只是胡说八道罢了,莫当真O(∩_∩)O~)。
但其实,无论是商品打折,亦或是调度公交,它们都是针对同一件事的不同处理方法,或者说,算法不同,那么我们就可以用策略模式了。
先来一瞅代码,其中抽象类和具体实现不变,增加一个策略配置类。
//策略配置类class 策略配置{ 收费 strategy; public 策略配置 (收费 specific_strategy) { this.strategy = specific_strategy; } public double 策略配置接口() { return strategy.计算总价(xx); }}这样子,整体的构建就完成了,最后看下客户端的调用,惊喜时刻来临:
//Mainint main(){ 策略配置 oper; oper = new 策略配置(new 打八折(xx)); oper.策略配置接口(); oper = new 策略配置(new 满99减45(xx)); oper.策略配置接口(); return 0;}
有没有很惊喜?是的,你没看错,它又回去了~第一反应就是:还不如简单工厂呢。。。
但它的优势在哪?直接在客户端根据需要调用即可,没有简单工厂那么的遮遮掩掩,当然喽,就封装性而言,简单工厂更胜一筹。
那么如何让它看起来更好?
很简单,更改策略配置类。
//策略配置类class 策略配置{ 收费 strategy; public 策略配置 (string str) { switch (str) { case "打八折" : { 打八折 oper1 = new 打八折(); strategy = oper1; } break; case "满99减45" : { 满99减45 oper2 = new 满99减45(); strategy = oper2; } break; …… } } public double 策略配置接口(double money) { return strategy.计算总价(money); }}这时候再看客户端这时候就和简单工厂时类似了,其实我们只是把判断放回了封装类而已。
这便是策略模式与简单工厂的一个结合吧。
不过,笔者在这里要提醒各位的是:大部分情况下,择一即可,并不一定结合就是好,比如笔者,更偏爱纯粹的策略模式。其实两者区别不大,只是策略模式在封装时更复杂,增加了单一实例,通过构造函数和自带函数来传达一个更完整的处理流程罢了。
2014.4.30 小结
至此,最为基础的三个模式已经全部讲清楚了,也写了快一小时,休息下,以后继续。(我的目标是:签完工作的两周内,路漫漫o(╯□╰)o)
未完待续...
不过,还是先给出CSDN《大话设计模式》电子版的地址:http://download.csdn.net/detail/yousuosi/4364766
希望多多支持原作者,同样作为一个卖脑力劳动的我们,一定能明白是多么辛苦,尊重与分享,有点条件还是买本正版吧~
最后啰嗦句:这么好的书,不持有一本实在可惜。
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式~~~~~~~~~~
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- IOS开发~web在线安装App
- 索引
- 数字类型转换成字符串类型并逆序输出
- 电阻式触摸屏UI设计
- IntelliJ IDEA 12 创建Web项目 教程 超详细版
- 设计模式
- 瀑布流视图控件“quilt”的用法
- 项目规划阶段-甲方要求乙方在项目周例会上应该陈述的事情
- 关于内核模块挂载出现“no symbol version for”问题的研究
- 关于JSP和HTML
- iOS开发者协会 iOS开发常用的第三方类库
- JSP中的page,request,session,application
- cpu 多核/多cpu
- 错误处理:your content must have a TabHost whose id attribute is 'android.R.id.tabhost'