1 / 15
文档名称:

Scala设计模式.pdf.pdf

格式:pdf   页数:15页
下载后只包含 1 个 PDF 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

Scala设计模式.pdf.pdf

上传人:dfjmvg964 2016/6/29 文件大小:0 KB

下载得到文件列表

Scala设计模式.pdf.pdf

相关文档

文档介绍

文档介绍:Scala设计模式---***@CrazyJvm译本文展示了一些经典的软件设计模式在Scala中的实现。所谓设计模式,就是针对在软件设计过程中出现的一些共性问题,从而产生的一种可重用的解决方案。设计模式不是已完成的代码,而更像是一个可以在不同场景下解决问题的通用模板。模式是由一些设计的最佳实践组成的,可以帮助我们避免一些问题,并且能增加代码的可读性,及加快开发进度。经典的设计模式(一般指GoF)都是基于面向对象的。他们展示了类与对象间的关系和行为。这些模式并不能很好的应用到纯函数式编程语言上,但是既然Scala是一种结合了面向对象编程和函数式编程的语言,那Scala还是能够采用这些模式的,甚至是在函数式风格的Scala代码中。很多时候设计模式被认为是某种语言缺乏一些特性的信号。在此种情况下,当一种语言提供了相关特性以后,这些模式可以被简化或者索性消除。得益于Scala富有表现力的语法,很多经典设计模式都可以直接实现。尽管Scala还有一些基于语言特性的设计模式,单本文还是着重于介绍大家所周知的经典设计模式,因为这些设计模式被认为是开发者之间交流的工具。●创建型设计模式 1、工厂方法模式 2、延迟加载模式 3、单例模式●结构型模式 1、适配器模式 2、装饰模式●行为型模式 1、值对象模式 2、空值模式 3、策略模式 4、命令模式 5、责任链模式 6、依赖注入模式一、工厂方法模式工厂方法模式将对实际类的初始化封装在一个方法中,让子类来决定初始化哪个类。工厂方法允许: 1、组合复杂的对象创建代码 2、选择需要初始化的类 3、缓存对象 4、协调对共享资源的访问我们考虑静态工厂模式,这和经典的工厂模式略有不同,静态工厂方法避免了子类来覆盖此方法。在Java中,我们使用new关键字,通过调用类的构造器来初始化对象。为了实现这个模式1 ,我们需要依靠普通方法,此外我们无法在接口中定义静态方法,所以我们只能使用一个额外的工厂类。 Java: publicinterfaceAnimal{} privateclassDogimplementsAnimal{} privateclassCatimplementsAnimal{} lassAnimalFactory{ publicstaticAnimalcreateAnimal(Stringkind){ if("cat".equals(kind))returnnewCat()? if("dog".equals(kind))returnnewDog()? thrownewIllegalArgumentException()?} }("dog")?除了构造器之外,Scala提供了一种类似于构造器调用的特殊的语法,其实这就是一种简便的工厂模式。 Scala: traitAnimal privateclassDogextendsAnimal privateclassCatextendsAnimal objectAnimal{ defapply(kind:String)=kindmatch{ case"dog"=>newDog() case"cat"=>newCat() } }Animal("dog") 以上代码中,工厂方法被定义为伴生对象,它是一种特殊的单例对象,和之前定义的类或特质具有相同的名字,并且需要定义在同一个原文件中。这种语法仅限于工厂模式中的静态工厂模式,因为我们不能将创建对象的动作代理给子类来完成。优势: ★重用基类名字★标准并且简洁★类似于构造器调用劣势: ★仅限于静态工厂方法 2 二、延迟初始化模式延迟初始化是延迟加载的一个特例。它指仅当第一次访问一个值或者对象的时候,才去初始化他们。延迟初始化可以延迟或者避免一些比较复杂的运算。在Java中,一般用null来代表未初始化状态,但假如null是一个合法的final值的时候,我们就需要一个独立的标记来指示初始化过程已经进行。在多线程环境下,对以上提到的标记的访问必须要进行同步,并且会采用双重检测技术(double-check)来保证正确性,当然这也进一步增加了代码的复杂性。 Java: ponent? ponent(){ ponent? if(result==null){ synchronized(this){ ponent? if(result==null){ component=result=ponent()?} } }returnresult?} Scala提供了一个内置的语法来定义延迟变量. Scala: lazyvalx={ print("(computingx)") 42 }print("x=") println(x) //x=(computingx)42 在Scala中,延迟变量能够持