读Android源码设计模式解析与实战(第一章面向对象的六大原则)

来源:互联网 发布:鲍勃.马利 知乎 编辑:程序博客网 时间:2024/06/03 15:52

    买了很多书,也看了很多,但有一个毛病就是看的时候很明白,但是看过不久就忘了,可见温故而知新是很重要的,所以想重拾上学时的习惯,记笔记好了,经常来看看,记录下看的时候的心得、体会。鼓励自己坚持下去

    OOP在java中很重要,提到OOP就会想到面向对象的六大原则,说实话我的android开发算是自学的,大学也不是学的计算机,所以计算机基础不是特别厉害,当然就说明我的java功底薄弱呀难过,对面向对象一直停留在封装、继承、多态的了解阶段,但我知道面向对象有多么重要,所以先来理解一下它的六大原则。这里按照读书的顺序来记录我的理解。


    1.1 优化代码的第一步      单一职责原则(Single Responsibility Principles)

     读了这一节,所谓一心不可二用,就我个人的理解单一职责原则就是对于一个类而言,它只专注于做一件事,即明确类的职责,比如我要展示一本书的详情,就创建一个名为ActivityBookDetail的类,在类中只展示书籍详情,展示书籍详情就是这个类的职责,如果我在这个类中也要去展示一个电影的详情,可想而知这个类的代码在阅读、维护、修改方面有多么的可怕。

     在这本书的例子就是小民要写一个图片加载器的案例,在案例中小民的ImageLoader类在最初状态不仅要完成加载图片的功能,还包含了处理图片缓存的代码,由此可见这个类做了不止一件事,所以违背了单一职责原则,小民经过修改后在最初的ImageLoader类中提取出了一个图片缓存类ImageCache,在这个类中进行处理图片缓存的代码,哈哈哈,这就是单一职责呦。现在想想我在代码中总是把创建界面和编辑界面复用,类也复用,好不应该啊,不过如果用好这个原则应该是对需求功能仔细分析之后再确定一个类的职责是什么。


    1.2 让程序更稳定、更灵活    开闭原则(Open Close Principles)

    开闭原则,它是Java中最基础的设计原则,听到这个名字有点茫然,从名称中看不出他开了什么又闭了什么,它的概念是:软件中的对象(类、模块、函数等)应该对于拓展是开放的,但对于修改是封闭的。在实际的开发中,当需求有变更的时候,我们应该尽量去在原有的基础上拓展(我理解的拓展就是可以把基础的内容提取成接口、抽象类等,有实现类来实现、继承),在拓展(实现类)中去修改、增加新的功能需求。想想我们的代码中总会有BaseActivity ,当创建新界面的时候,继承BaseActivity,在新界面中去实现功能,而不是去BaseActivity中操作应该也是一种开闭原则吧(个人观点,如若不对请指正)。

      在这本书中,还是小民在实现了第一节功能后,需要添加SD卡缓存和双缓存两个新功能,小民一开始是把这两个缓存功能加到了ImageCache类中,同时ImageLoader类也做了相应的修改,可见这样是不利于代码拓展的,如果每次加新的功能时,都要修改ImageLoader类,会让ImageLoader类变得越来越复杂,bug的出现几率也就增大了。在主管的修改下,提取出一个接口,接口定义了获取图片和存放图片的方法(仔细分析这两个方法其实就是缓存类需要对外提供的,有了这两个方法就能实现图片的展示和缓存,在ImageLoader中也只是专注于这两个方法来实现功能而已,不用关心缓存是怎么做的),这样所有的缓存类不管是内存缓存、SD卡缓存还是双缓存的类,都实现基础接口,实现相应的方法,拓展功能,就使的代码看起来简洁多了,以后再有变动也利于拓展功能。当然了原始类也是可以修改的,只是尽量不去改而已。

      这个原则充分体现了抽象的重要性呀。

    1.3 构建拓展性更好的系统  里氏替换原则(Liskov Substitution Principles)

       里氏替换原则:所有引用基类的地方必须能透明的使用其子类的对象,这个很简单的就可以看出这个原则的核心是抽象,而抽象又依赖于继承。如小民的例子中,当选小民的代码实现了开闭原则,在ImageLoader类中设置缓存模式是这样实现的

     ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

       private ImageCahce mImageCache;//ImageCahce 是对外提供getBItmap和setImageUrl设置图片缓存的接口

       public void setImageCache(ImageCache cache){

       mImageCache=cache;//cahce是ImageCache的接口实现类

       }

     +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

     ImageLoader imageLoader=new ImageLoader();

     imageLoader.setImageCache(new MemoryCache);//内存缓存实现ImageCahce接口

     imageLoader.setImageCache(new DiskCache);//SD缓存实现ImageCahce接口

     imageLoader.setImageCache(new DoubleCache);//双缓存缓存实现ImageCahce接口


       简单理解就是用抽象实现的功能,都能替换成它的子类来完成。比如在开发过程中所有的控件都可以定义成View,继承View的控件就可以实现VIew所做的事。开闭原则和里氏替换原则往往傻傻的纠结在一起,通过里氏替换原则来实现拓展

     1.4 让项目拥有变化的能力   依赖倒置原则(Dependence Inversion Princlples)

      这个原则说实话我看了2遍也不是很理解,依赖倒置原则指代了一种特定的解耦形式,使得高层次的模块不依赖于低层次的模块的实现细节的目的,依赖模块被颠倒了,抓狂

感觉都读不通顺不过经过作者分析,这个原则有三个关键点:

     a、高层模块不应该依赖底层模块,两者都应该依赖抽象,高层次模块指调用端,低层模块指实现类

     b、抽象不应该依赖细节、细节应该依赖抽象    抽象指接口或抽象类   细节指实现类即底层模块

     在Java中它的具体体现就是模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系通过接口或抽象类实现,目的就是为了解实现类与实现类间的耦合,所以要依赖抽象而不依赖具体实现类


      1.5 系统有更高的灵活性   接口隔离原则(InterfaceSegregation Principles)

       接口隔离原则:客户端不应该依赖它不需要的接口,即类间的依赖关系应该建立在最小接口上。我的理解就是把复杂的功能细节化,儿这些细节就是一小点一小点的接口,用最小化的接口实现类的细节使系统拥有更低的耦合性、更高的灵活性。

      

       1.6 更好的拓展性  迪米特原则(Law of Demeter)

        这个原则也叫最少知识原则:一个对象应该对其它对象有最少的了解。调用者或者依赖者只要知道它需要的方法即可,至于方法是如何实现的,实现方法的类需要做什么,都不需要知道。知道的越少耦合度约低,当一个类发生变化的时候,对另一个类的影响越小 。感觉就是买菜和卖菜的人  ,买着不关心菜长在那块地上,只要卖菜的有菜卖给我就好大笑 貌似有点牵强,不过我是理解了。



     面向对象很高深,它的六大原则有的也很高深,不过重点是思维,灵活有效的运用这些原则,就可以在实现系统稳定性的前提下保持拓展性、高内聚、低耦合,在版本变更的过程中保持清晰、灵活、稳定的系统架构。所以在写代码之前要学会分析,不要只为了实现功能来堆代码,完全不管后续的change,当然了我也明白灵活使用这些原则不是一朝一夕就可以的,需要时刻铭记着几大原则、常思考、多应用。

    

阅读全文
1 0
原创粉丝点击