package main
import "fmt"
type Knob struct {
door *Door
latched bool
}
func NewKnob(d *Door) *Knob {
k := new(Knob)
k.door = d
k.latched = true
return k
}
func (k *Knob) IsLatchedOff() bool {
return !k.latched
}
func (k *Knob) Turn() {
k.latched = false
}
func (k *Knob) Unturn() {
if k.door.IsClose() { k.latched = true }
}
type Door struct {
Knob *Knob
closed bool
}
func NewDoor() *Door {
d := new(Door)
d.Knob = NewKnob(d)
d.closed = true
return d
}
func (d *Door) IsClose() bool {
return d.closed
}
func (d *Door) IsOpen() bool {
return !d.closed
}
func (d *Door) CanBeOpen() bool {
return d.IsOpen() || d.Knob.IsLatchedOff()
}
func (d *Door) Push() {
if d.CanBeOpen() { d.closed = false }
}
func (d *Door) Pull() {
d.closed = true
d.Knob.Unturn()
}
func main(){
var door *Door = NewDoor()
fmt.Println("door is a Door...")
door.Knob.Turn()
fmt.Println("door.Knob.Turn(); door.CanBeOpen() => ", door.CanBeOpen())
door.Knob.Unturn()
fmt.Println("door.Knob.Unturn(); door.CanBeOpen() => ", door.CanBeOpen())
door.Push()
fmt.Println("door.Push(); door.IsOpen() => ", door.IsOpen())
door.Knob.Turn(); door.Push()
fmt.Println("door.Knob.Turn(); door.Push(); door.IsOpen() => ", door.IsOpen())
door.Pull()
fmt.Println("door.Pull(); door.IsClose() => ", door.IsClose())
fmt.Println("door.CanBeOpen() => ", door.CanBeOpen(), "\n")
}
cGFja2FnZSBtYWluCmltcG9ydCAiZm10IgoKdHlwZSBLbm9iIHN0cnVjdCB7Cglkb29yICpEb29yCglsYXRjaGVkIGJvb2wKfQoKZnVuYyBOZXdLbm9iKGQgKkRvb3IpICpLbm9iIHsKCWsgOj0gbmV3KEtub2IpCglrLmRvb3IgPSBkCglrLmxhdGNoZWQgPSB0cnVlCglyZXR1cm4gawp9CgpmdW5jIChrICpLbm9iKSBJc0xhdGNoZWRPZmYoKSBib29sIHsKCXJldHVybiAhay5sYXRjaGVkCn0KCmZ1bmMgKGsgKktub2IpIFR1cm4oKSB7CglrLmxhdGNoZWQgPSBmYWxzZQp9CgpmdW5jIChrICpLbm9iKSBVbnR1cm4oKSB7CglpZiBrLmRvb3IuSXNDbG9zZSgpIHsgay5sYXRjaGVkID0gdHJ1ZSB9Cn0KCnR5cGUgRG9vciBzdHJ1Y3QgewoJS25vYiAqS25vYgoJY2xvc2VkIGJvb2wKfQoKZnVuYyBOZXdEb29yKCkgKkRvb3IgewoJZCA6PSBuZXcoRG9vcikKCWQuS25vYiA9IE5ld0tub2IoZCkKCWQuY2xvc2VkID0gdHJ1ZQoJcmV0dXJuIGQKfQoKZnVuYyAoZCAqRG9vcikgSXNDbG9zZSgpIGJvb2wgewoJcmV0dXJuIGQuY2xvc2VkCn0KCmZ1bmMgKGQgKkRvb3IpIElzT3BlbigpIGJvb2wgewoJcmV0dXJuICFkLmNsb3NlZAp9CgpmdW5jIChkICpEb29yKSBDYW5CZU9wZW4oKSBib29sIHsKCXJldHVybiBkLklzT3BlbigpIHx8IGQuS25vYi5Jc0xhdGNoZWRPZmYoKQp9CgpmdW5jIChkICpEb29yKSBQdXNoKCkgewoJaWYgZC5DYW5CZU9wZW4oKSB7IGQuY2xvc2VkID0gZmFsc2UgfQp9CgpmdW5jIChkICpEb29yKSBQdWxsKCkgewoJZC5jbG9zZWQgPSB0cnVlCglkLktub2IuVW50dXJuKCkKfQoKZnVuYyBtYWluKCl7Cgl2YXIgZG9vciAqRG9vciA9IE5ld0Rvb3IoKQoJZm10LlByaW50bG4oImRvb3IgaXMgYSBEb29yLi4uIikKCWRvb3IuS25vYi5UdXJuKCkKCWZtdC5QcmludGxuKCJkb29yLktub2IuVHVybigpOyBkb29yLkNhbkJlT3BlbigpID0+ICIsIGRvb3IuQ2FuQmVPcGVuKCkpCglkb29yLktub2IuVW50dXJuKCkKCWZtdC5QcmludGxuKCJkb29yLktub2IuVW50dXJuKCk7IGRvb3IuQ2FuQmVPcGVuKCkgPT4gIiwgZG9vci5DYW5CZU9wZW4oKSkKCWRvb3IuUHVzaCgpCglmbXQuUHJpbnRsbigiZG9vci5QdXNoKCk7IGRvb3IuSXNPcGVuKCkgPT4gIiwgZG9vci5Jc09wZW4oKSkKCWRvb3IuS25vYi5UdXJuKCk7IGRvb3IuUHVzaCgpCglmbXQuUHJpbnRsbigiZG9vci5Lbm9iLlR1cm4oKTsgZG9vci5QdXNoKCk7IGRvb3IuSXNPcGVuKCkgPT4gIiwgZG9vci5Jc09wZW4oKSkKCWRvb3IuUHVsbCgpCglmbXQuUHJpbnRsbigiZG9vci5QdWxsKCk7IGRvb3IuSXNDbG9zZSgpID0+ICIsIGRvb3IuSXNDbG9zZSgpKQoJZm10LlByaW50bG4oImRvb3IuQ2FuQmVPcGVuKCkgPT4gIiwgZG9vci5DYW5CZU9wZW4oKSwgIlxuIikKfQ==