接口实现OCP设计原则

OCP(Open-Closed Principle)——开闭原则
对扩展是开放的,对修改是关闭的
image.png

  1. package main
  2. import "fmt"
  3. type Pet interface {
  4. eat()
  5. sleep()
  6. }
  7. type Dog struct {
  8. }
  9. type Cat struct {
  10. }
  11. // Dog 实现 Pet 接口
  12. func (dog *Dog) eat() {
  13. fmt.Println("dog eat...")
  14. }
  15. func (dog *Dog) sleep() {
  16. fmt.Println("dog sleep...")
  17. }
  18. // Cat 实现 Pet 接口
  19. func (cat *Cat) eat() {
  20. fmt.Println("cat eat...")
  21. }
  22. func (cat *Cat) sleep() {
  23. fmt.Println("cat sleep...")
  24. }
  25. type Person struct {
  26. }
  27. // pet 既可以传递Dog也可以传递Cat
  28. func (per *Person) care(pet Pet) {
  29. pet.eat()
  30. pet.sleep()
  31. }
  32. func main() {
  33. dog := Dog{}
  34. cat := Cat{}
  35. person := Person{}
  36. person.care(&dog)
  37. person.care(&cat)
  38. }

模拟OOP思想

image.png
image.png

继承

通过结构体嵌套实现继承

  1. package main
  2. import "fmt"
  3. type Animal struct {
  4. name string
  5. age int
  6. }
  7. func (a Animal) eat() {
  8. fmt.Println("eat...")
  9. }
  10. func (a Animal) sleep() {
  11. fmt.Println("sleep...")
  12. }
  13. type Dog struct {
  14. Animal
  15. color string
  16. }
  17. type Cat struct {
  18. Animal
  19. b string
  20. }
  21. func main() {
  22. dog := Dog{
  23. Animal{name:"花花",age:2},
  24. "黑色",
  25. }
  26. dog.eat()
  27. dog.sleep()
  28. fmt.Printf("dog.color: %v\n", dog.color)
  29. fmt.Printf("dog.age: %v\n", dog.age)
  30. cat := Cat{
  31. Animal{name:"嘿嘿", age:3},
  32. "bbb",
  33. }
  34. cat.eat()
  35. cat.sleep()
  36. fmt.Printf("cat: %v\n", cat)
  37. }