- 浏览: 13191 次
- 性别:
- 来自: 南京
文章分类
最新评论
package com.linewell.modeldesgin.state
/**
* * 状态模式,银行账户,环境类
* Created by ctao on 2015/9/2.
* @param owner 持卡人
* @param state 账户状态
* @param balance 余额
*/
class Account(owner: String, var state: State = null, var balance: Double = 0) {
/**
* 初始化帐号,设置帐号为正常状态
*/
state = NormalState(this)
/**
* 存款
* @param amount 操作金额
*/
def deposit(amount: Double): Unit = {
println(s"${owner}存款$amount")
state.deposit(amount)
println(s"现在余额为$balance")
println(s"现在账户状态为${state.getClass.getName.split("\\.").last}")
println("---------------------------------------")
}
/**
* 取款
* @param amount 操作金额
*/
def withdraw(amount: Double): Unit = {
println(s"${owner}取款$amount")
state.withdraw(amount)
println(s"现在余额为$balance")
println(s"现在账户状态为${state.getClass.getName.split("\\.").last}")
println("---------------------------------------")
}
/**
* 检测帐号状态是否需要支付利息
*/
def computeInterest(): Unit = state.computeInterest()
/**
* 正常状态
* @param account 账户
*/
case class NormalState(var account: Account) extends State {
override def computeInterest(): Unit = println("正常状态无需利息")
override def withdraw(amount: Double): Unit = amount match {
case x if account.balance + 2000 < x => println(s"卡上余额不足,请重新选择取款金额")
case _ => account.balance -= amount
stateCheck()
}
override def deposit(amount: Double): Unit = {
account.balance += amount
stateCheck()
}
override def stateCheck(): Unit = account.balance match {
case x if x > -2000 && x <= 0 => account.state = OverdraftState(account)
case x if x == -2000 => account.state = RestrictedState(account)
case x if x < -2000 => println("操作受限")
case x if x > 0 =>
case _ => println(s"正常下异常${account.balance}")
}
}
/**
* 冻结状态
* @param account 账户
*/
case class OverdraftState(var account: Account) extends State {
override def withdraw(amount: Double): Unit = amount match {
case x if account.balance + 2000 < x => println(s"卡上余额不足,请重新选择取款金额")
case _ => account.balance -= amount
stateCheck()
}
override def deposit(amount: Double): Unit = {
account.balance += amount
stateCheck()
}
override def computeInterest(): Unit = println("透支状态计算利息")
override def stateCheck(): Unit = account.balance match {
case x if x > 0 => account.state = NormalState(account)
case x if x == -2000 => account.state = RestrictedState(account)
case x if x < -2000 => println("操作受限")
case x if x < 0 && x > -2000 =>
case _ => println(s"冻结下异常${account.balance}")
}
}
/**
* 限制状态
* @param account 账户
*/
case class RestrictedState(var account: Account) extends State {
override def deposit(amount: Double): Unit = {
account.balance += amount
stateCheck()
}
override def computeInterest(): Unit = println("受限状态计算利息")
override def withdraw(amount: Double): Unit = println("帐号受限,取款失败")
override def stateCheck(): Unit = account.balance match {
case x if x > 0 => account.state = NormalState(account)
case x if x > -2000 => account.state = OverdraftState(account)
}
}
}
trait State {
/**
* 帐号
*/
protected var account: Account
/**
* 存钱
* @param amount 操作金额
*/
def deposit(amount: Double)
/**
* 取钱
* @param amount 操作金额
*/
def withdraw(amount: Double)
/**
* 检测状态
*/
def computeInterest(): Unit
/**
* 状态转化
*/
def stateCheck(): Unit
}
package com.linewell.modeldesgin.state
/**
* 测试客户端
* Created by ctao on 2015/9/2.
*/
object Client extends App {
val acc1 = new Account("chen")
val acc2 = new Account("chen")
acc1.deposit(1000)
acc1.withdraw(20000)
acc1.withdraw(2000)
acc1.withdraw(1001)
acc1.computeInterest()
println("++++++++++++++++++++++++++")
acc2.deposit(10001)
acc2.withdraw(200)
acc2.withdraw(2000)
acc2.withdraw(1001)
acc2.computeInterest()
}
package com.linewell.modeldesgin.state
/**
* 屏幕类,环境类
* Created by ctao on 2015/9/2.
*/
class Screen(var long: Int = 1, var wide: Int = 1) {
/**
* 初始化屏幕状态
*/
private var screenState: ScreenState = NormalScreenState(this)
/**
* 显示长宽
*/
show()
/**
* 点击事件,点击触发状态的改变
*/
def onClick(): Unit = screenState match {
case NormalScreenState(_) =>
this.wide += this.wide
this.long += this.long
screenState = LargerScreenState(this)
print("点击:")
screenState.display()
case LargerScreenState(_) =>
this.wide += this.wide
this.long += this.long
screenState = LargestScreenState(this)
print("点击:")
screenState.display()
case LargestScreenState(_) =>
this.wide = this.wide / 4
this.long = this.long / 4
screenState = NormalScreenState(this)
print("点击:")
screenState.display()
}
/**
* 展示
*/
def show(): Unit ={
print("显示:")
screenState.display()
}
}
/**
* 密封屏幕状态
*/
sealed abstract class ScreenState {
def display(): Unit = {}
}
/**
* 正常状态
* @param screen 屏幕
*/
case class NormalScreenState(screen: Screen) extends ScreenState {
override def display(): Unit = {
println(s"正常大小,长:${screen.wide},宽:${screen.long}")
}
}
/**
* 放大两倍状态
* @param screen 屏幕
*/
case class LargerScreenState(screen: Screen) extends ScreenState {
override def display(): Unit = {
println(s"两倍大小,长:${screen.wide},宽:${screen.long}")
}
}
/**
* 放大四倍状态
* @param screen 屏幕
*/
case class LargestScreenState(screen: Screen) extends ScreenState {
override def display(): Unit = {
println(s"四倍大小,长:${screen.wide},宽:${screen.long}")
}
}
package com.linewell.modeldesgin.state
/**
* 测试客户端
* Created by ctao on 2015/9/2.
*/
object ClientScreen extends App {
val screen = new Screen
screen.show()
screen.onClick()
screen.show()
screen.onClick()
screen.onClick()
screen.onClick()
}
package com.linewell.modeldesgin.state
/**
*开关
* Created by ctao on 2015/9/2.
*/
case class Switch(name: String) {
/**
* 初始化状态
*/
protected var state: SwitchState = OnState
def on() = {
print(name)
state.on(this)
}
def off() = {
print(name)
state.off(this)
}
/**
* 打开状态
*/
case object OnState extends SwitchState {
def on(switch: Switch) = println("已经打开")
def off(switch: Switch) = {
println("关闭")
switch.state = OffState
}
}
/**
* 关闭状态
*/
case object OffState extends SwitchState {
def on(switch: Switch) = {
println("打开")
switch.state = OnState
}
def off(switch: Switch) = println("已经关闭")
}
}
/**
* 密封开关状态类
*/
sealed abstract class SwitchState {
/**
* 打开
* @param switch 开关
*/
def on(switch: Switch): Unit
/**
* 关闭
* @param switch 开关
*/
def off(switch: Switch): Unit
}
package com.linewell.modeldesgin.state
/**
* 测试客户端
* Created by ctao on 2015/9/2.
*/
object ClientSwitch extends App{
val s1 = Switch("1")
val s2 = Switch("2")
s1.on()
s1.off()
s1.off()
s1.on()
s2.on()
s2.off()
s2.off()
s2.on()
}
/**
* * 状态模式,银行账户,环境类
* Created by ctao on 2015/9/2.
* @param owner 持卡人
* @param state 账户状态
* @param balance 余额
*/
class Account(owner: String, var state: State = null, var balance: Double = 0) {
/**
* 初始化帐号,设置帐号为正常状态
*/
state = NormalState(this)
/**
* 存款
* @param amount 操作金额
*/
def deposit(amount: Double): Unit = {
println(s"${owner}存款$amount")
state.deposit(amount)
println(s"现在余额为$balance")
println(s"现在账户状态为${state.getClass.getName.split("\\.").last}")
println("---------------------------------------")
}
/**
* 取款
* @param amount 操作金额
*/
def withdraw(amount: Double): Unit = {
println(s"${owner}取款$amount")
state.withdraw(amount)
println(s"现在余额为$balance")
println(s"现在账户状态为${state.getClass.getName.split("\\.").last}")
println("---------------------------------------")
}
/**
* 检测帐号状态是否需要支付利息
*/
def computeInterest(): Unit = state.computeInterest()
/**
* 正常状态
* @param account 账户
*/
case class NormalState(var account: Account) extends State {
override def computeInterest(): Unit = println("正常状态无需利息")
override def withdraw(amount: Double): Unit = amount match {
case x if account.balance + 2000 < x => println(s"卡上余额不足,请重新选择取款金额")
case _ => account.balance -= amount
stateCheck()
}
override def deposit(amount: Double): Unit = {
account.balance += amount
stateCheck()
}
override def stateCheck(): Unit = account.balance match {
case x if x > -2000 && x <= 0 => account.state = OverdraftState(account)
case x if x == -2000 => account.state = RestrictedState(account)
case x if x < -2000 => println("操作受限")
case x if x > 0 =>
case _ => println(s"正常下异常${account.balance}")
}
}
/**
* 冻结状态
* @param account 账户
*/
case class OverdraftState(var account: Account) extends State {
override def withdraw(amount: Double): Unit = amount match {
case x if account.balance + 2000 < x => println(s"卡上余额不足,请重新选择取款金额")
case _ => account.balance -= amount
stateCheck()
}
override def deposit(amount: Double): Unit = {
account.balance += amount
stateCheck()
}
override def computeInterest(): Unit = println("透支状态计算利息")
override def stateCheck(): Unit = account.balance match {
case x if x > 0 => account.state = NormalState(account)
case x if x == -2000 => account.state = RestrictedState(account)
case x if x < -2000 => println("操作受限")
case x if x < 0 && x > -2000 =>
case _ => println(s"冻结下异常${account.balance}")
}
}
/**
* 限制状态
* @param account 账户
*/
case class RestrictedState(var account: Account) extends State {
override def deposit(amount: Double): Unit = {
account.balance += amount
stateCheck()
}
override def computeInterest(): Unit = println("受限状态计算利息")
override def withdraw(amount: Double): Unit = println("帐号受限,取款失败")
override def stateCheck(): Unit = account.balance match {
case x if x > 0 => account.state = NormalState(account)
case x if x > -2000 => account.state = OverdraftState(account)
}
}
}
trait State {
/**
* 帐号
*/
protected var account: Account
/**
* 存钱
* @param amount 操作金额
*/
def deposit(amount: Double)
/**
* 取钱
* @param amount 操作金额
*/
def withdraw(amount: Double)
/**
* 检测状态
*/
def computeInterest(): Unit
/**
* 状态转化
*/
def stateCheck(): Unit
}
package com.linewell.modeldesgin.state
/**
* 测试客户端
* Created by ctao on 2015/9/2.
*/
object Client extends App {
val acc1 = new Account("chen")
val acc2 = new Account("chen")
acc1.deposit(1000)
acc1.withdraw(20000)
acc1.withdraw(2000)
acc1.withdraw(1001)
acc1.computeInterest()
println("++++++++++++++++++++++++++")
acc2.deposit(10001)
acc2.withdraw(200)
acc2.withdraw(2000)
acc2.withdraw(1001)
acc2.computeInterest()
}
package com.linewell.modeldesgin.state
/**
* 屏幕类,环境类
* Created by ctao on 2015/9/2.
*/
class Screen(var long: Int = 1, var wide: Int = 1) {
/**
* 初始化屏幕状态
*/
private var screenState: ScreenState = NormalScreenState(this)
/**
* 显示长宽
*/
show()
/**
* 点击事件,点击触发状态的改变
*/
def onClick(): Unit = screenState match {
case NormalScreenState(_) =>
this.wide += this.wide
this.long += this.long
screenState = LargerScreenState(this)
print("点击:")
screenState.display()
case LargerScreenState(_) =>
this.wide += this.wide
this.long += this.long
screenState = LargestScreenState(this)
print("点击:")
screenState.display()
case LargestScreenState(_) =>
this.wide = this.wide / 4
this.long = this.long / 4
screenState = NormalScreenState(this)
print("点击:")
screenState.display()
}
/**
* 展示
*/
def show(): Unit ={
print("显示:")
screenState.display()
}
}
/**
* 密封屏幕状态
*/
sealed abstract class ScreenState {
def display(): Unit = {}
}
/**
* 正常状态
* @param screen 屏幕
*/
case class NormalScreenState(screen: Screen) extends ScreenState {
override def display(): Unit = {
println(s"正常大小,长:${screen.wide},宽:${screen.long}")
}
}
/**
* 放大两倍状态
* @param screen 屏幕
*/
case class LargerScreenState(screen: Screen) extends ScreenState {
override def display(): Unit = {
println(s"两倍大小,长:${screen.wide},宽:${screen.long}")
}
}
/**
* 放大四倍状态
* @param screen 屏幕
*/
case class LargestScreenState(screen: Screen) extends ScreenState {
override def display(): Unit = {
println(s"四倍大小,长:${screen.wide},宽:${screen.long}")
}
}
package com.linewell.modeldesgin.state
/**
* 测试客户端
* Created by ctao on 2015/9/2.
*/
object ClientScreen extends App {
val screen = new Screen
screen.show()
screen.onClick()
screen.show()
screen.onClick()
screen.onClick()
screen.onClick()
}
package com.linewell.modeldesgin.state
/**
*开关
* Created by ctao on 2015/9/2.
*/
case class Switch(name: String) {
/**
* 初始化状态
*/
protected var state: SwitchState = OnState
def on() = {
print(name)
state.on(this)
}
def off() = {
print(name)
state.off(this)
}
/**
* 打开状态
*/
case object OnState extends SwitchState {
def on(switch: Switch) = println("已经打开")
def off(switch: Switch) = {
println("关闭")
switch.state = OffState
}
}
/**
* 关闭状态
*/
case object OffState extends SwitchState {
def on(switch: Switch) = {
println("打开")
switch.state = OnState
}
def off(switch: Switch) = println("已经关闭")
}
}
/**
* 密封开关状态类
*/
sealed abstract class SwitchState {
/**
* 打开
* @param switch 开关
*/
def on(switch: Switch): Unit
/**
* 关闭
* @param switch 开关
*/
def off(switch: Switch): Unit
}
package com.linewell.modeldesgin.state
/**
* 测试客户端
* Created by ctao on 2015/9/2.
*/
object ClientSwitch extends App{
val s1 = Switch("1")
val s2 = Switch("2")
s1.on()
s1.off()
s1.off()
s1.on()
s2.on()
s2.off()
s2.off()
s2.on()
}
发表评论
-
linux mongodb3安装
2015-10-29 15:33 259http://blog.csdn.net/cjuexuan/a ... -
scala代码重构(用递归代替var和while)
2015-09-07 19:47 380原有代码,其中使用了while循环和var /** ... -
再探设计模式之观察者模式(股票通知系统)
2015-09-05 10:28 496package com.linewell.modeldesig ... -
再探设计模式之状态模式(纸牌游戏的开发)
2015-09-04 13:52 537状态模式主要用于检测和切换状态,在状态模式下状态的转化对于客户 ... -
再探设计模式之访问者模式
2015-09-03 14:44 478访问者模式的使用条件比较苛刻主要可以以用于新增访问者时只需要 ... -
scala实现访问者模式
2015-09-02 20:54 374package com.linewell.modeldesgi ... -
scala实现模版方法模式
2015-09-02 20:54 414package com.linewell.modeldesgi ... -
scala实现观察者模式
2015-09-02 16:35 588package com.linewell.modeldesgi ... -
scala实现迭代器模式
2015-09-01 22:56 465package com.linewell.modeldesgi ... -
scala实现备忘录模式
2015-09-01 22:54 339package com.linewell.modeldesgi ... -
scala实现中介者模式
2015-09-01 14:48 285package com.linewell.modeldesgi ... -
scala实现解释器模式
2015-08-31 20:20 315本来是看解释器模式,但感觉scala的实现的流利接口可以更优雅 ... -
scala实现命令模式
2015-08-30 21:20 269package com.linewell.modeldesgi ... -
scala实现职责链模式
2015-08-30 13:38 304package com.linewell.modeldesgi ... -
scala实现享元模式
2015-08-30 00:17 335package com.linewell.modeldesgi ... -
scala实现代理模式
2015-08-30 00:16 485package com.linewell.modeldesgi ... -
scala实现外观模式
2015-08-28 21:41 310package com.linewell.modeldesgi ... -
scala实现装饰者模式
2015-08-16 19:52 394package com.linewell.modeldesgi ... -
scala实现组合模式
2015-08-16 11:14 833package com.linewell.modeldesgi ... -
scala实现桥接模式
2015-08-16 11:13 311package com.linewell.modeldesgi ...
相关推荐
很大篇幅都放在,使用scala实现scala默认库文件的API中,通过对简单的函数式编程逻辑的介绍和实践,主要是实践,建立起来一个比较明晰的scala思维模式,或者叫函数式编程的思维模式。 2 无副作用的函数式编程,同时...
Scala宠物商店 在scala中使用FP技术实现Java宠物商店。谢谢! 特别感谢 ,他也维护了这个项目; 以及继续改善宠物商店的许多状态我有大多数端点。 万一你们都想伸出援手,剩下的大块头了: 创建一个ScalaJS React...
充分利用 Scala 的类型系统——编译器应该验证模式的完整性。 做一个冗长的 DSL——尽量减少样板代码,但要易于阅读! 项目状态 该项目目前正在积极开发和维护。 它用于高吞吐量、内存密集型场景的大型生产代码库...
全球资深Java技术专家的力作,系统、全面地讲解如何将模块化设计思想引入开发中,涵盖18个有助于实现模块化软件架构的模式 中文目录: 第一部分 模块化的理由 第1章 模块定义 1.1 定义模块 1.1.1 可部署 1.1.2...
全球资深Java技术专家的力作,系统、全面地讲解如何将模块化设计思想引入开发中,涵盖18个有助于实现模块化软件架构的模式 中文目录: 第一部分 模块化的理由 第1章 模块定义 1.1 定义模块 1.1.1 可部署 1.1.2 可...
该项目旨在收集一组使用 Akka 实现 actor 系统的建议和最佳实践。 虽然大多数示例可能在 Scala 中,但概念、实践和建议也应该适用于 Java。 一般编程指南 前三名 从不阻塞 永远不要传递可变状态:不要关闭字段、 ...
拥抱ReactiveX的异步性,实现并发性和实现独立性。 在Web上使用RxJS或在移动设备上使用Rx.NET和RxJava来处理UI事件和API响应。 避免使用复杂的有状态程序,对可观察的流使用干净的输入/输出功能。 ReactiveX的操作...
##rationalle:Akka asks 不好 问题一:他们创建... 请参阅以了解有关 ask 模式的上述问题的更多讨论。 ###用法示例: class SimpletonConsultant extends RequestRespondActor { var simpletonesCounter = 0 def take
Tiny-world对这种模式进行了抽象,并以一种方式来实现,除非您这样说,否则API的用户都不知道传递的状态(甚至不知道其类型)。 有三种实现,但可能要使用的是FreeWorld ,这也是最简单的一种。 老实说,只需复制...
使用fs2流实现应用程序状态 发布/订阅模式 简报 () ()() 消息的处理如下: 在ChatRoutes(processInput)中 通过WebSocket收到的消息 消息文本解析为InputMessage InputMessage路由到Queue 在ChatServer...