浅谈设计模式的学习(上)

作为一个开发人员,能写出一个漂亮可扩展的代码,绝对是一件令人愉快的事情。那设计模式就是一门必修课!

本文就自己学习设计模式的一点经历做一个记录。

本人在读大学时,为了学习设计模式就买了一本《java与模式》的数据,书籍有一千多页很重、而且价格不菲。没办法,花那么多钱买的不看岂不浪费。于是每天早上读一章,坚持几个月我终于读完了。这几个月真是煎熬啊,几个月下来,回忆一下似乎自己真得也没收获到什么,很悍然啊。难道是书籍不好吗还是我读的不认真?其实在我现在看来都不是。而为什么读完了却什么也没收获到呢?我觉着:第一是因为我当时编码的经历不够丰富、第二没有理解设计模式的用途和思想。所以学了有点白学。至于编码经验这个只能靠自己多练习,没什么好说的。这里就说说我对设计模式学习的一点理解吧

 
1、学习设计模式,首先要理解设计模式到底是什么。

     
 曾经我一度认为,一个设计模式就是一个固定结构的代码,比如观察者模式,就是在一个被观察者里边维护一个集合,将观察者放进这个集合里,一有事件触发便遍历集合里的观察者调用他们的某个方法。(如果你也这么理解,那赶快收手吧,否则你会很痛苦的)这么理解对吗?至少我现在认为是打错特错的。总共有23种设计模式,是不多,但是如果把每个设计模式理解成一个代码结构的话肯定会很乱,因为有好多设计模式代码结构很相似,比如代理模式和装饰者模式,这么理解只会让你混乱搞不清楚,你认为呢?。那我们该怎么理解设计模式呢,个人觉着哈,一个设计模式是针对的一个应用场景,比如代理模式和装饰模式,代码结构很相似,但是代理模式的用途是为了添加别的功能,比如spring的aop就是代理模式的一个很好地应用,项目中有很多数据库操作,但是无论是曾、删、改操作前都要打开事务,操作后要提交事务,所以采用代理,将这打开和关闭事务统一管理,这就是相当于在增删改操作前后添加了别的操作;而装饰模式呢,他是加强和装饰某一个已有的功能,最经典的应用就是jdk里的输入输出流了,比如BufferedInputStream就是给InputStream加强了基于缓存读写数据流的功能。所以这里我再强调一遍,设计模式是针对不同的应用场景而不是一个代码结构(千万不要通过代码结构去区分不同的设计模式,就像前边说的代理和装饰,代码结构相似,但是应用目的是不同的)。切记其珍惜啊

2、学习设计模式,首先要清楚设计模式能干什么。

   
 学习设计模式,你需要心里认可他,但是对于很多像我一样的一些初学者吧,因为体会不到他的好处,心里就没有去认可他,所以也无从踏心的去学习了。设计模式有什么好处呢?能干什么呢?在这里我举个例子:(希望你看了也能有所感触)

我们经常要遍历一个集合,这个集合可能是ArrayList也可能是LinkedList,学过数据结构的都知道这两个集合的数据结构是不同的,数据结构不同,所以遍历方式肯定也不同,这样现实开发中你要记住每一个数据结构的遍历方式,如果数据结构更多,那岂不是很累啊(相信你会赞同吧)。但是现实中你遍历集合,因为集合数据结构的不同而采用不同的遍历方式了吗?肯定没有吧,无论是基于数组还是链表的集合,我们用一个Iterator搞定,你只需要在意iterator的两个方法(hasNext()和next())而不必理会集合的内部数据结构。简单吧,爽吗,反正我是感觉很爽,这就是设计模式的一个好处。这里采用的什么设计模式呢?不知道能想到吗,工厂方法模式。ArrayList和LinkedList作为工厂生产自己的Iterator,因为只有自己了解自己内部数据结构和遍历方式。这里他们创建的迭代器都实现了Iterator接口,我们是针对的接口编程,所以体会不到不同集合创建的迭代器的不同。(现在你是否认可了设计模式啊,是否认识到他是有用的呢,如果因为这篇文章让你认可了它,真是我的荣幸啊,哈哈)

上边这个例子可以说是设计模式能够封装变化,让客户端调用(就是你调用你用设计模式编写的类的地方,比如main方法里)不受变化的影响;下边我再举个例子,说一下设计模式另一个能干的事------对方便扩展(就是开闭原则)

大家知道开关和灯泡,开关都有一个打开关闭的功能,无论你是声控开关还是其他各种类型的开关;灯泡都有一个亮和灭的功能,无乱你是白炽灯、闪关灯的。这样我们可以分别为灯泡和开关提取一个接口,灯泡接口和开关接口,灯泡接口提供亮和灭方法,开关提供开和关方法。代码如下:

快关接口:


public interface Switch {

public void setLight(Light light);

public void open();

public void close();
}

1 public interface Light {
2
3 public void lightUp();
4
5 public void LightOff();
6 }

在这里我们再提供一个普通的快关实现:


 1 public class NormalSwitch implements Switch{
2
3 private Light light;
4
5 public void setLight(Light light){
6 this.light=light;
7 }
8
9 @Override
10 public void open() {
11 light.lightUp();
12 }
13
14 @Override
15 public void close() {
16 light.LightOff();
17 }
18 }

这是一个普通的灯泡实现:


public class NormalLight implements Light {

@Override
public void lightUp() {
System.out.println("灯亮了");
}

@Override
public void LightOff() {
System.out.println("灯灭了");
}

}

接下来是客户端的调用了:


public class Main {

public static void main(String[] args) {
Light light = new NormalLight();

Switch swtich= new NormalSwitch();

swtich.setLight(light);

swtich.open();

swtich.close();
}

}

接下来说一说这么做如何有利于扩展了,比如我要换灯泡了,换个高端大气上档次的:


 1 public class LuxuriousLight implements Light {
2
3 @Override
4 public void lightUp() {
5 System.out.println("灯泡豪华的亮了");
6 }
7
8 @Override
9 public void LightOff() {
10 System.out.println("灯泡骄傲的灭了");
11 }
12
13 }

对于客户端要怎么变化呢?来吧看一看:


 1 public class Main {
2
3 public static void main(String[] args) {
4 Light light = new LuxuriousLight();//NormalLight();
5
6 Switch swtich= new NormalSwitch();
7
8 swtich.setLight(light);
9
10 swtich.open();
11
12 swtich.close();
13 }
14
15 }

看,我们之前的普通灯泡没有收到任何影响吧,如果还有别的客户端使用了普通的灯泡,我们新添加的奢侈的灯泡绝对不会影响到他们的逻辑。当然有朋友可能会说,客户端不也是把new
NormalLight改成了new
LuxuriousLight了吗,呵呵,这点改动不无妨,主要是我们后边通过开关关闭点灯的逻辑没有变化。这无论是应对变化还是可扩展性都是很有帮助的。在这里不知道你想到了这是什么设计模式吗?没错,就是桥接模式,简单吧。

学习设计模式有一点特别特别重要的一点,就是抽象思维,这是整个设计模式的基石,由于时间原因,下次再续。O(∩_∩)O~

作为程序员,身体是一切的根本,注意身体健康,五一快乐哦

浅谈设计模式的学习(上),码迷,mamicode.com

时间: 2024-07-31 14:30:35

浅谈设计模式的学习(上)的相关文章

浅谈设计模式的学习(下)

时间过得真快啊,不知不觉又要周末了,借这个周末时间.把<浅谈设计模式的学习(下)>补上吧. 在<浅谈设计模式的学习(中)>中,说到了保持抽象的思维.接下来说一下第四点,做一个分享,也记录一下自己的学习历程. 4.学习设计模式,就不要把它看的太认真    设计模式是一个编程思想,它不是具体的代码套路.举个例子说明一下: 由于家传,接触到了一些中国的传统武术.当我与那些不懂传统武术的人交流的时候,他们总是认为中国的传统武术都是些套路.花架子,只是用来好看.在他们认为,两人打架,别人出拳

浅谈设计模式的学习(中)

在<浅谈设计模式的学习(上)>中我说到了设计模式的基石-----抽象思维.为什么需要抽象思维呢?因为越抽象就越不容易出错,就像有些领导人说话:坚持改革开放.但怎么算坚持改革开放呢,没有具体的标准,因事而异,所以就不容易违背这个坚持改革开放的原则了. 3.学习设计模式,要保持抽象的思维     什么是抽象思维呢?真的不好说,抽象的东西往往难以说明白,听了也难以搞明白,还是通过具体的例子来说吧 有这么一个学生请假的场景,如果请假时间一天以内则有班长批准就可以了,三天以内则需要老师批准,超过三天就得

浅谈设计模式1-策略模式

对于大多数面向对象的初学者来说,将思维模式从面向过程转变过来是一个比较困难的过程.很多人在用面向对象语言编写程序的时候,依然会感觉自己在用面向过程的思维,笔者分享这篇文章的用意便是希望可以对大家有一些积极的影响. 阅读本文可以是没有接触设计模式,但需要一定的面向对象基础,至少简单理解封装,继承多态. 对于刚开始接触设计模式来说,一开始就说概念性的东西,很少能够理解.所以我们可以先跳过这些,通过一个小的程序场景来进行一个比较直观的认识. 模拟魂斗罗发射子&弹 相信大家小的时候玩过一款叫魂斗罗的游戏

【数学教学论文】浅谈小学生数学学习兴趣的培养

浅谈小学生数学学习兴趣的培养 作者:刘亚儒 摘要:古代教育家朱熹曾说:"教人未见其兴趣,必不乐学."由此可见,兴趣的培养在教学过程中至关重要,有利于提高数学课堂的教学效率和学生的学习质量.因此,本文对如何培养学生数学学习兴趣进行了进一步探讨. 关键词:小学生:数学:兴趣培养 一.兴趣在小学生数学学习中的重要性 孔子说过:"知之者不如好之者,好之者不如乐之者."所谓"乐",其实就是我们所说的"喜欢",即兴趣.学习兴趣是学生学习的

浅谈设计模式3-模板方法模式

模版方法模式,个人认为还是用处比较多的一个设计模式,而且也是比较好学和理解的一个.依然来通过模拟一个场景来慢慢了解. 现在我们来实现一下泡茶这个过程.首先我们需要烧开一壶水,然后往茶壶中放茶叶,加入开水,等待茶泡好. 经过前两次的分享,大家应该具备了基本的面向对象的思想了,这里就不再用面向过程的方式演示了. 首先,有一种普通人,他泡茶的方式是这样的 public class Common     { public void MakeTea()         {             Heat

【大话设计模式】——浅谈设计模式基础

初学设计模式给我最大的感受是:人类真是伟大啊!单单是设计模式的基础课程就让我感受到了强烈的生活气息. 个人感觉<大话设计模式>这本书写的真好.让貌似非常晦涩难懂的设计模式变的生活化.趣味化. 以下浅谈一下对设计模式基础的理解,假设理解的不好.还请大家指正. 首先设计模式是对面向对象的更专业的诠释.面向对象的三大基本特征是继承.封装.多态. 继承: 1.子类继承父类非private的属性和功能. 个人理解:有几个老婆是私有属性,小明他爸有好几个老婆.小明呢.恰好赶上了国家颁布法律一夫一妻 制(怎

浅谈设计模式

米老师布置了作业,分析23种设计模式的异同,绞尽脑汁,冥思苦想还是认为初学设计模式,此问题过于高深实在不敢妄语.可是作业始终是要交的,只好浅谈一下设计模式,如理解有误,也算留下了一个底子,日后回头再看,这便是成长. 关于分类,设计模式分为三大类,分别为行为型,创建型,和状态型. 亦有几大原则,分别为:单一职责原则.开放-封闭原则.依赖导致原则.迪米特法则. 总体来说,不论什么模式,都是为了更好的发挥面向对象的思想,来加强类内部的内聚,来降低类与类之间的耦合,尽量做到"高内聚,低耦合",

浅谈Java的学习

Java就是用来做项目的!Java的主要应用领域就是企业级的项目开发!要想从事企业级的项目开发,你必须掌握如下要点: 1.掌握项目开发的基本步骤2.具备极强的面向对象的分析与设计技巧3.掌握用例驱动.以架构为核心的主流开发方法 没有人愿意自己一辈子就满足于掌握了一些代码实现的技巧,别人告诉你要实现什么,你就用代码堆砌来实现别人的要求!你必须学会从整个项目的角度去思考!你必须学会假如你是项目经理,你该如何思考!你必须学会假如你是架构师,你该如何思考!你必须掌握针对某个特定问题领域的分析方法! 关于

浅谈身为小白学习Linux系统的四点实用建议

游戏.办公.安全,可以总结为是方便当代人们在生活中的刚需,我们大都是这些服务的使用者,而把单个功能整合起来那就必须谈到互联网,自然而然通过互联网要将Service发送给Service management,经过Service management的处理将结果反馈给使用者,整个过程下来总结为:发送请求.处理请求.反馈请求,这就是一切方便用户,用户只需要发送和接收反馈,而中间的网络传输和服务的处理就交给网络运营商和服务运营商,根据我们的标题,我们这次来简谈下服务运营商端是怎么处理相对复杂的服务请求.