装饰模式
/**
* 水果特质,定义价格和名称两个抽象方法
*/
trait Fruits {
def price(): Double
def name(): String
}
/**
* 定义三个特质作为水果子类
*/
trait Apple extends Fruits {
abstract override def price() = super.price() + 10
abstract override def name() = super.name() + "\n+苹果"
}
trait Banana extends Fruits {
abstract override def price() = super.price() + 5
abstract override def name() = super.name() + "\n+香蕉"
}
trait Cherry extends Fruits {
abstract override def price() = super.price() + 20
abstract override def name() = super.name() + "\n+樱桃"
}
/**
* 这里定义为trait 也是一样
*/
class Cashier extends Fruits {
//定义初始值,实现抽象方法
override def price() = 0
override def name() = ""
}
/**
* 客户端调用,类似java的装饰模式
*/
object Client extends App {
//对象混入特质
private val order1 = new Cashier with Cherry with Apple
//with Banana with Cherry
println("-----------------order1-->")
println("本次购买的水果:" + order1.name())
println("总价:" + order1.price())
println("---------------order2-->")
private val order2 = new Cashier with Banana with Apple with Cherry
println("本次购买的水果:" + order2.name())
println("总价:" + order2.price())
}
执行结果:
-----------------order1-->
本次购买的水果:
+樱桃
+苹果
总价:30.0
---------------order2-->
本次购买的水果:
+香蕉
+苹果
+樱桃
总价:35.0
Process finished with exit code 0