println("Step 1: Create a trait which knows how to do create, read, update and delete operations CRUD to a given database")
trait DonutDatabase[A] { def addOrUpdate(donut: A): Long def query(donut: A): A def delete(donut: A): Boolean
} println("\nStep 2: Create a class which extends trait DonutDatabase and knows how to perform CRUD operations with Apache Cassandra as storage layer")
class CassandraDonutStore[A] extends DonutDatabase[A] { override def addOrUpdate(donut: A): Long = {
println(s"CassandraDonutDatabase-> addOrUpdate method -> donut: $donut") } override def query(donut: A): A = {
println(s"CassandraDonutDatabase-> query method -> donut: $donut")
donut
} override def delete(donut: A): Boolean = {
println(s"CassandraDonutDatabase-> delete method -> donut: $donut")
true
}
} println("\nStep 3: Create a trait which will define the methods for a data access layer and will require dependency injection for DonutDatabase")
trait DonutShoppingCartDao[A] { val donutDatabase: DonutDatabase[A] // dependency injection def add(donut: A): Long = {
println(s"DonutShoppingCartDao-> add method -> donut: $donut")
donutDatabase.addOrUpdate(donut)
} def update(donut: A): Boolean = {
println(s"DonutShoppingCartDao-> update method -> donut: $donut")
donutDatabase.addOrUpdate(donut)
true
} def search(donut: A): A = {
println(s"DonutShoppingCartDao-> search method -> donut: $donut")
donutDatabase.query(donut)
} def delete(donut: A): Boolean = {
println(s"DonutShoppingCartDao-> delete method -> donut: $donut")
donutDatabase.delete(donut)
} } println("\nStep 4: Create a trait which will define the methods for checking donut inventory and will require dependency injection for DonutDatabase")
trait DonutInventoryService[A] { val donutDatabase: DonutDatabase[A] // dependency injection def checkStockQuantity(donut: A): Int = {
println(s"DonutInventoryService-> checkStockQuantity method -> donut: $donut")
donutDatabase.query(donut) } } println("\nStep 5: Create a trait which will act as a facade which extends multiple traits namely trait DonutShoppingCartDao and trait DonutInventoryService. It also inject the correct DonutDatabase implementation - a CassandraDonutStore")
trait DonutShoppingCartServices[A] extends DonutShoppingCartDao[A] with DonutInventoryService[A] {
override val donutDatabase: DonutDatabase[A] = new CassandraDonutStore[A]()
} println("\nStep 6: Create a DonutShoppingCart class which extends a single facade named DonutShoppingCartServices to expose all the underlying features required by a DonutShoppingCart")
class DonutShoppingCart[A] extends DonutShoppingCartServices[A] { } println("\nStep 7: Create an instance of DonutShoppingCart and call the add, update, search and delete methods")
val donutShoppingCart: DonutShoppingCart[String] = new DonutShoppingCart[String]()
donutShoppingCart.add("Vanilla Donut")
donutShoppingCart.update("Vanilla Donut")
donutShoppingCart.search("Vanilla Donut")
donutShoppingCart.delete("Vanilla Donut") println("\nStep 8: Call the checkStockQuantity method")
donutShoppingCart.checkStockQuantity("Vanilla Donut")

result:

Step 1: Create a trait which knows how to do create, read, update and delete operations CRUD to a given database

Step 2: Create a class which extends trait DonutDatabase and knows how to perform CRUD operations with Apache Cassandra as storage layer

Step 3: Create a trait which will define the methods for a data access layer and will require dependency injection for DonutDatabase

Step 4: Create a trait which will define the methods for checking donut inventory and will require dependency injection for DonutDatabase

Step 5: Create a trait which will act as a facade which extends multiple traits namely trait DonutShoppingCartDao and trait DonutInventoryService. It also inject the correct DonutDatabase implementation - a CassandraDonutStore

Step 6: Create a DonutShoppingCart class which extends a single facade named DonutShoppingCartServices to expose all the underlying features required by a DonutShoppingCart

Step 7: Create an instance of DonutShoppingCart and call the add, update, search and delete methods
DonutShoppingCartDao-> add method -> donut: Vanilla Donut
CassandraDonutDatabase-> addOrUpdate method -> donut: Vanilla Donut
DonutShoppingCartDao-> update method -> donut: Vanilla Donut
CassandraDonutDatabase-> addOrUpdate method -> donut: Vanilla Donut
DonutShoppingCartDao-> search method -> donut: Vanilla Donut
CassandraDonutDatabase-> query method -> donut: Vanilla Donut
DonutShoppingCartDao-> delete method -> donut: Vanilla Donut
CassandraDonutDatabase-> delete method -> donut: Vanilla Donut Step 8: Call the checkStockQuantity method
DonutInventoryService-> checkStockQuantity method -> donut: Vanilla Donut
CassandraDonutDatabase-> query method -> donut: Vanilla Donut

  

最新文章

  1. C堆栈入门
  2. 如何申请https证书、搭建https网站
  3. 用jq编码解码一个url地址
  4. Scrum站立会议----11月4日
  5. log tree(merge)
  6. history.back(-1)和history.go(-1)的区别
  7. USACO3.24Feed Ratios
  8. 多说【最近访客】JS插件通用代码使用方法
  9. PHP根据URL提取根域名
  10. ArrayList源码解析(二)自动扩容机制与add操作
  11. java获取当前上一周、上一月、上一年的时间
  12. POJ 2014.K-th Number 区间第k小 (归并树)
  13. 山东省第四届acm解题报告(部分)
  14. Actor模型---SwiftActors
  15. struts2从浅至深(三)拦截器
  16. Python自动化之modelform和原生ajax
  17. python学习,day4:生成器
  18. Cocos2d-js 开发记录:骨骼动画载入
  19. linux命令(3):rpm命令
  20. homebrew的安装与使用

热门文章

  1. Linux基本命令讲解
  2. Python3遍历指定文件夹下所有文件及文件夹
  3. hadoop 完全分布式搭建总结
  4. vue 下拉刷新数据的插件的使用:
  5. A Story of One Country (Hard) CodeForces - 1181E2 (分治)
  6. java.lang.AbstractMethodError: null
  7. ABP 基于DDD的.NET开发框架 学习(三)创建模块:任务管理
  8. 字符串replace的理解和练习和配合正则表达式的使用
  9. google mock C++单元测试框架
  10. 在vue项目中使用live2d