专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Java教程 » scala:Scala和设计模式 »正文

scala:Scala和设计模式

来源: 发布时间:星期四, 2008年12月18日 浏览:2次 评论:0
在当前软件Software设计中最流行要算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’而不是‘如果你需要映射回到Java语言只需要定义个所有域/思路方法都是

2.Strategy(策略模式)


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

trait TaxPayer
Employee(sal: Long) extends TaxPayer
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 = Employee(1000)
//A strategy to calculate tax for employees
def empStrategy(e: Employee) = Math.ceil(e.sal * .3) toLong
calculateTax(employee, empStrategy)

val npo = 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 {
   "Race"   => RaceCar;
   "Normal" => NormalCar;
   _        => throw 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 Expression {
...
public void accept(Visitor v);
}

Identier extends Expression {
}
Sum extends Expression {
}
..

Visitor {
public void visit(Identier i) { }
public void visit(Sum s) { }
}


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

Identier(value: Int) extends Expression {
}
Sum extends Expression {
}

object EvalVisitor {
def visit(expr: Expression): Int = expr match {
  (Identier(v)) => v
  (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
FileReader extends Reader {
type T = char
def read: char = ..
}

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

 

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


相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: