阅读更多

10顶
6踩

企业架构

原创新闻 Scala和设计模式

2008-04-01 09:56 by 见习记者 yuesc 评论(5) 有9785人浏览

 

在当前软件设计中最流行的要算GoF这本书中提出的各种设计模式。很多人认为,设计模式对于程序语言(特别是c++/Java)本身的不足之处或多或少有一些弥补,不过如果语言足够强大,模式也许没有必要。

下面Peter Norvig的一个例子就非常有代表性。在有些语言中,使用设计模式在使代码变得自然和简洁,但是模式本身使用方便性也很重要。不妨让我们来看看Scala(一种类似Ruby/Lisp之类的语言,它一定程度上降低了模式实现的繁琐)中常用的一些模式。    

1.Singleton(单体模式) 

单体模式是一种非常频繁使用到的模式。尽管它是一种最简单的模式,而要在Java语言中实现的纯粹的单体模式却是异常困难。尤其是涉及到著名的double-checked locking 等问题。然而,对于Scala语言,一点也不难。可以说,你只是需要创建一个单体模式的Registry对象。按下面步骤:
object Registry {
def getEntry(): Entry {
}
//Other fields/methods
}
//Create and use the singleton
val entry = Registry.getEntry

      这样就行了,唯一的区别是定义一个普通类时使用关键词‘object’而不是‘class’。如果你需要映射回到Java语言,只需要定义一个所有域/方法都是static的类。

2.Strategy(策略模式)


      对于把函数功能用一组对象来实现或者带有截止功能的语言来说,策略模式是一个明显的选择。下面以‘征税’为例:

trait TaxPayer
case class Employee(sal: Long) extends TaxPayer
case class NonProfitOrg(funds: BigInt) extends TaxPayer

//Consider a generic tax calculation function. (It can be in TaxPayer also).
def calculateTax[T <: TaxPayer](victim: T, taxingStrategy: (T => long)) = {
  taxingStrategy(victim)
}

val employee = new Employee(1000)
//A strategy to calculate tax for employees
def empStrategy(e: Employee) = Math.ceil(e.sal * .3) toLong
calculateTax(employee, empStrategy)

val npo = new NonProfitOrg(100000000)
//The tax calculation strategy for npo is trivial, so we can inline it
calculateTax(nonProfit, ((t: TaxPayer) => 0) 

3.Factory(工厂模式)

 

工厂模式是针对那种对象构造函数不能返回仲裁对象的情况的。 如果你调用对象A的构造函数生成对象,

你得到的是一个对象A。如果你需要其它不同类型的对象,一般创建一个单体工厂。在Scala语言中你也要做这样的事,但是实现的方式更为优雅:  

object Car {
def apply(String type) {
  type match {
   case "Race"   => new RaceCar();
   case "Normal" => new NormalCar();
   case _        => throw new Exception;
  }
}
}
//And you can create cars like:
val myCar = Car("Race")
//instead of more verbose
//Car myCar = CarFactory.getInstance().createCar("Ferrari"); 
基本上,这样你可以利用这个方式,看起来就像一个构造函数调用一个单体对象。

 

4.Vistor(访问者模式)

 

访问者模式被许多人认为是有害的,但是它有自己的价值。让我们来看看在Java中典型的使用访问者模式的例子:

 abstract class Expression {
...
public void accept(Visitor v);
}

class Identifier extends Expression {
}
class Sum extends Expression {
}
..

class Visitor {
public void visit(Identifier i) { }
public void visit(Sum s) { }
}


典型的Java样本代码如你所熟悉的那样。在Scala语言中,利用模式匹配你可以达到同样的效果:
trait Expression {
...
}

case class Identifier(value: Int) extends Expression {
}
case class Sum extends Expression {
}

object EvalVisitor {
def visit(expr: Expression): Int = expr match {
  case (Identifier(v)) => v
  case (Sum(e1, e2))   => visit(e1) + visit(e2)
}
}

但是这种模式匹配的代码具有更大的灵活性。

 

5.Decorator(装饰模式)

 

最后来看一下装饰模式,既然Scala支持mixins和隐式转换,装饰模式也是简单和自然的。在概念上,有两个途径可以用来给一个对象加入新的功能以扩展现有功能。你可以使用隐式转换,也考虑使用Scala的标准库中的RichInt类,只需要下面的操作:

val range1to10 = 1 to 10
在Scala语言中是调用to把1转换为10。但是在Int类中没有to方法。它怎么处理呢? Scala公司有一个新的概念叫做implicits,来调用你的库。某种程度上,这其实是Ruby的公开类。这是个有趣的事,你可以在任意地方读取它。对我们来说,这里预先包含了一个隐式的转换。Mixins也可以很好的扩展你的类功能。下面考虑一个典型的阅读方面的接口:

trait Reader {
type T
def read: T
}

trait SynchronizedReader extends Reader {
abstract override def read: T = synchronized(super.next)
}

trait BufferedReader extends Reader {
abstract override def read: T = {
//buffering code
super.read
}
}

//A concrete implementation
class FileReader extends Reader {
type T = char
def read: char = ..
}

//Now we can mix in stuff that we need
//Create a FileReader
val f = new FileReader
//create a fileReader which is synchronized
val syncReader = new FileReader with SynchronizedReader
//create a fileReader which is synchronized and buffered
val bsReader = new FileReader with BufferedReader with SynchronizedReader

 

结论 
设计模式是软件设计中很有用的一种指导方式。但是,大部分模式只是解决语言本身的问题,而不是关于设计方面的。要是你有一个好的语言方式,那么大部分的模式将变得无足轻重。比如,一个结构化的语言,虚方法和虚类的概念也是一种设计模式。如果你使用一种足够强大的语言,你需要的设计方式也会更高级。随着发展,它们越将演变为一种更高层次的抽象。

 

来自: http://memuser.blogspot.com/2008/03/design-patterns-in-scala.html
10
6
评论 共 5 条 请登录后发表评论
5 楼 iceblooded 2012-06-21 15:58
看不懂 ,赞
4 楼 liaofeng_xiao 2011-03-26 15:06
非常赞,有时间可以试着用Scala改写23种设计模式
3 楼 rmn190 2010-11-22 11:05
喜欢这种以设计模式角度来观察框架的文章, 赞一个!
2 楼 caixicai 2009-07-25 13:00
喜欢看此类文章
1 楼 zhida 2009-07-15 18:47
好赞的帖子

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • Scala和设计模式.pdf

    scala:Scala和设计模式 疯狂代码 http://CrazyCoder.cn/ ĵ:http:/CrazyCoder.cn/Java/Article42687.html 在当前软件Software设计中最流行要算GoF这本书中提出各种设计模式很多人认为设计模式对于语言(特 别是c/Java...

  • Scala设计模式

    Scala设计模式,Scala高阶参考书。

  • scala pattern design 设计模式

    scala 设计模式,详细讲述scala设计模式

  • Scala三种常用设计模式

    Scala三种常用设计模式 三种工厂模式 简单工厂模式 不是23种设计模式之一,通过定义一个创建对象的类,由这个类来封装实例化对象它的行为 工厂方法模式 工厂方法模式将对实际类的初始化封装在一个方法中,让子类来...

  • scala-patterns::trophy:Scala4You设计模式

    Scala设计模式旨在为自适应应用程序原型提供各种用例场景和体系结构概念。 mkdocs.yml # Configuration file. docs/ readme.md # General information summary.md # Table of contents units/ design-patterns...

  • Scala设计模式UML图例和代码实现实战 行为模式--命令设计模式

    在讨论命令设计模式时,通常会有几个对象,每个对象都有自己的特定角色: 1.命令:我们可以将其视为调用者调用的接口及其实现。{ MakeSandwichCommand,CleanUpCommand PourJuiceCommand} 2.Receiver:这是实际知道...

  • scala设计模式

    本文展示了一些经典的软件设计模式在Scala中的实现。尽管Scala还有一些基于语言特性的设计模式,单本文还是着重于介绍大家所周知的经典设计模式,因为这些设计模式被认为是开发者之间交流的工具。

  • Scala设计模式--工厂模式

    @Scala-设计模式 工厂模式 简单工厂模式 /** * 汽车的共同特质 */ trait Car{ def run() } /** * 创建一个宝马类 */ class BaoMa extends Car { override def run(): Unit = println(&amp;amp;amp;amp;amp;...

  • scala设计模式--装饰模式

    装饰模式 /** * 水果特质,定义价格和名称两个抽象方法 */ trait Fruits { def price(): Double def name(): String } /** * 定义三个特质作为水果子类 */ trait Apple extends Fruits { abstract ...

  • scala模式设计--策略模式

    * 1.scala 实现策略模式很简单 用函数定义策略 * 2.定义一个类接收函数 * * @author Yyyyy * @version 1.0 * **/ /** * 操作数据的环境类(收银员) * * @param discount * @param originalPrice */ ...

  • Scala实现单例模式

    单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。 通过单例模式可以保证系统中一个类只有一个实例。 对于系统中的某些类来说,只有一个实例很重要,例如, 一个系统中可以存在...

  • Scala基础【模板方法设计模式、面向对象编程】

    逻辑没有变化,抽象类也没有变化,重点是用哪具体的类,这种代码的写法叫做模板方法的设计模式。父类将算法的骨架搭建好,子类只需要实现具体的细节即可。在执行时,只需要创建不同的子类就可以完成不同的功能。 ...

  • 《大数据: Scala 设计模式》

    一、Scala 设计模式介绍 1.学习设计模式的必要性 面试会被问,所以必须学 读源码时看到别人在用,尤其是一些框架大量使用到设计模式,不学看不懂源码为什么这样写,比如Runtime的单例模式. 设计模式能让专业人...

  • Strategy_Scala_Design_Pattern:Scala中启动模式组成的设计模式实现

    策略模式 意图 定义一系列算法,封装每个算法,并使它们可互换。策略使算法可以独立于使用该算法的客户端而变化。 适用性 在以下情况下使用策略模式 许多相关的类仅在行为上有所不同。策略提供了一种使用多种行为之...

  • scala设计模式_Scala中的工厂设计模式

    scala设计模式I’m going to deliver a series of Scala Design Patterns in my coming posts. I will pick-up each Java Design Pattern Tutorial explained in JournalDEV and convert it into Scala. 我将在以后...

  • design-patterns-scala:用Scala语言实现设计模式

    design-patterns-scala:用Scala语言实现设计模式

  • scala_ao_patterns:Scala中面向方面的设计模式实现

    探索在Scala中对称实现面向方面的设计模式的可能性 抽象的 在面向方面的编程中,可以在非对称和对称实现之间进行区分。 面向方面的设计模式以类似AspectJ的非对称实现方式为人所知。 它们的分类之一是控制面向方面...

  • scala实现单例设计模式

    Unit = { println(s"student3: SCHOOL = ${Student3.school} NAME = $name AGE= $age") } } object Student4 { //单例设计模式,只能通过下面的getInstance获取唯一的对象实例 private var student: Student4 = _ ...

  • scala-design-patterns:在Scala中实现的设计模式

    scala-design-patterns:在Scala中实现的设计模式

  • scala:分别使用懒汉式和饿汉式实现单例模式

    【代码】scala:分别使用懒汉式和饿汉式实现单例模式。

Global site tag (gtag.js) - Google Analytics