面向对象思想概念

面向对象思想概念

面向对象三大特性,封装、继承、多态。这些特性将事物抽象成对象,给对象赋一些属性和方法,外部就可以通过公开方法访问对象了。

一、设计原则

依赖倒置原则

  • 在面向对象设计中有一个重要的原则是依赖倒置(Dependence Inversion Principle),主要作用是解耦,让对象与对象之间松耦合。定义如下:高层模块不应该依赖底层模块,他们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象。要针对接口编程,不要对实现编程。
  • 依赖倒置原则基于这样一个事实:相对于细节的多变性,抽象的东西要稳定的多。
  • 抽象指的是接口或者抽象类,细节就是具体的实现类,使用接口或者抽象类的目的是制定好规范和契约,而不去涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成。

实例

任天堂 Switch 一经推出,就获得了玩家的一致好评。其上运行的《塞尔达传说:旷野之息》,是一款优秀的开放世界动作冒险游戏,值得品玩。有如下关于 Switch 的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
type Player struct {
}

func (p *Player) PlayZelda(s *Switch) {
s.Play()
}

type Switch struct {
}

func (s *Switch) Play() {
fmt.Print("Play Zelda by Switch")
}

上述书写的代码,只能让玩家在 Switch 主机上玩塞尔达。开发者以后可能会将游戏移植到电脑、手机端,为了让玩家也可以在电脑、手机上玩塞尔达,需要引入一个 IPlay 玩的接口,任何只要实现了这个接口的平台或者硬件,就可以让玩家在上面玩塞尔达。

1
2
3
4
// 游戏
type IPlay interface {
Play()
}

因此 Player 类与 IPlay 就有了依赖关系,而电脑、手机这些都属于玩塞尔达的硬件或者平台,各自实现 IPlay 接口即可,这样就符合依赖倒置原则了。最终实现代码如下:

main.go >folded
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// 游戏
type IPlay interface {
Play()
}

// 电脑
type PC struct {
}

func (pc *PC) Play() {
fmt.Print("Play by PC \n")
}

// 手机
type Phone struct {
}

func (ph *Phone) Play() {
fmt.Print("Play by Phone \n")
}

// 玩家
type Player struct {
}

func (p *Player) PlayZelda(play IPlay) {
play.Play()
}

func main() {
pc := &PC{}
ph := &Phone{}
player := new(Player)
player.PlayZelda(pc)
player.PlayZelda(ph)
}

总结

  • 低层模块尽量都要有抽象类或接口,或者两者都有。
  • 变量的声明类型尽量是抽象类或接口。
  • 使用继承时遵循里氏替换原则。依赖倒置原则的核心就是要我们面向接口编程,理解了面向接口编程,也就理解了依赖倒置原则。

参考文章:
依赖倒置原则(Dependence Inversion Principle)

评论

:D 一言句子获取中...

加载中,最新评论有1分钟缓存...