fork(1) download
  1. package main
  2. import "fmt"
  3.  
  4. type Knob struct {
  5. door *Door
  6. latched bool
  7. }
  8.  
  9. func NewKnob(d *Door) *Knob {
  10. k := new(Knob)
  11. k.door = d
  12. k.latched = true
  13. return k
  14. }
  15.  
  16. func (k *Knob) IsLatchedOff() bool {
  17. return !k.latched
  18. }
  19.  
  20. func (k *Knob) Turn() {
  21. k.latched = false
  22. }
  23.  
  24. func (k *Knob) Unturn() {
  25. if k.door.IsClose() { k.latched = true }
  26. }
  27.  
  28. type Door struct {
  29. Knob *Knob
  30. closed bool
  31. }
  32.  
  33. func NewDoor() *Door {
  34. d := new(Door)
  35. d.Knob = NewKnob(d)
  36. d.closed = true
  37. return d
  38. }
  39.  
  40. func (d *Door) IsClose() bool {
  41. return d.closed
  42. }
  43.  
  44. func (d *Door) IsOpen() bool {
  45. return !d.closed
  46. }
  47.  
  48. func (d *Door) CanBeOpen() bool {
  49. return d.IsOpen() || d.Knob.IsLatchedOff()
  50. }
  51.  
  52. func (d *Door) Push() {
  53. if d.CanBeOpen() { d.closed = false }
  54. }
  55.  
  56. func (d *Door) Pull() {
  57. d.closed = true
  58. d.Knob.Unturn()
  59. }
  60.  
  61. func main(){
  62. var door *Door = NewDoor()
  63. fmt.Println("door is a Door...")
  64. door.Knob.Turn()
  65. fmt.Println("door.Knob.Turn(); door.CanBeOpen() => ", door.CanBeOpen())
  66. door.Knob.Unturn()
  67. fmt.Println("door.Knob.Unturn(); door.CanBeOpen() => ", door.CanBeOpen())
  68. door.Push()
  69. fmt.Println("door.Push(); door.IsOpen() => ", door.IsOpen())
  70. door.Knob.Turn(); door.Push()
  71. fmt.Println("door.Knob.Turn(); door.Push(); door.IsOpen() => ", door.IsOpen())
  72. door.Pull()
  73. fmt.Println("door.Pull(); door.IsClose() => ", door.IsClose())
  74. fmt.Println("door.CanBeOpen() => ", door.CanBeOpen(), "\n")
  75. }
Success #stdin #stdout 0s 2980KB
stdin
Standard input is empty
stdout
door is a Door...
door.Knob.Turn(); door.CanBeOpen() =>  true
door.Knob.Unturn(); door.CanBeOpen() =>  false
door.Push(); door.IsOpen() =>  false
door.Knob.Turn(); door.Push(); door.IsOpen() =>  true
door.Pull(); door.IsClose() =>  true
door.CanBeOpen() =>  false