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

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

  本文就本身学习设计模式的一点经历作一个记录。程序员

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

  一、学习设计模式,首先要理解设计模式究竟是什么。数据库

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

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

     学习设计模式,你须要内心承认他,可是对于不少像我同样的一些初学者吧,由于体会不到他的好处,内心就没有去承认他,因此也无从踏心的去学习了。设计模式有什么好处呢?能干什么呢?在这里我举个例子:(但愿你看了也能有所感触)
数组

     咱们常常要遍历一个集合,这个集合多是ArrayList也多是LinkedList,学过数据结构的都知道这两个集合的数据结构是不一样的,数据结构不一样,因此遍历方式确定也不一样,这样现实开发中你要记住每个数据结构的遍历方式,若是数据结构更多,那岂不是很累啊(相信你会赞同吧)。可是现实中你遍历集合,由于集合数据结构的不一样而采用不一样的遍历方式了吗?确定没有吧,不管是基于数组仍是链表的集合,咱们用一个Iterator搞定,你只须要在乎iterator的两个方法(hasNext()和next())而没必要理会集合的内部数据结构。简单吧,爽吗,反正我是感受很爽,这就是设计模式的一个好处。这里采用的什么设计模式呢?不知道能想到吗,工厂方法模式。ArrayList和LinkedList做为工厂生产本身的Iterator,由于只有本身了解本身内部数据结构和遍历方式。这里他们建立的迭代器都实现了Iterator接口,咱们是针对的接口编程,因此体会不到不一样集合建立的迭代器的不一样。(如今你是否定可了设计模式啊,是否定识到他是有用的呢,若是由于这篇文章让你承认了它,真是个人荣幸啊,哈哈)缓存

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

    你们知道开关和灯泡,开关都有一个打开关闭的功能,不管你是声控开关仍是其余各类类型的开关;灯泡都有一个亮和灭的功能,无乱你是白炽灯、闪关灯的。这样咱们能够分别为灯泡和开关提取一个接口,灯泡接口和开关接口,灯泡接口提供亮和灭方法,开关提供开和关方法。代码以下:ide

快关接口:

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~

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

相关文章
相关标签/搜索