面向对象与设计模式有什么关系,可以说什么关系都没有。设计模式只是一种用来解决问题的规则,用面向对象来实现罢了。
面向对象有3个基本特征:
1. 继承
继承是指一个对象直接使用另一对象的属性和方法。
它可以使现有的代码具有可重用性和可扩展性。
2. 封装
封装是指隐藏对象的属性、方法的实现细节,仅对外公开接口。
3. 多态
多态是指同一个实体同时具有多种形式。
将一个对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,该对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。
在项目中,当我们过多的依赖if else或switch来决定执行哪种操作时,使用多态可以达到更好的效果(代码解耦,提高扩展性)。
【示例】
画家可以画画,音乐家可以弹奏,歌手可以唱歌。假设我们要在不同的条件下让他们做自己的事情。
常规做法(高耦合,扩展性差)
#-*- coding:utf-8 -*-
#画家可以画画
class Painter(object):
def paint(self):
return "painter is working."
#歌手可以唱歌
class Singer(object):
def sing(self):
return "singer is working."
#音乐家可以弹奏
class Pianist(object):
def play(self):
return "pianist is working."
#当所需要的角色越来越多时,if else就越来越多,代码看起来将十分冗余,低效
class MovieAction(object):
def getAction(self, role):
if role == "painter":
painter = paint()
return painter.working()
elif role == "singer":
singer = Singer()
return singer.sing()
elif role == "pianist":
pianist = Pianist()
return pianist.play()
else:
return "Sorry, the role doesn't exist."
if __name__ == "__main__":
movieAction = MovieAction()
print movieAction.getAction('singer')
print movieAction.getAction('shower')
"""print out
singer is working.
Sorry, the role doesn't exist.
"""
利用多态(低耦合,扩展性好)
#-*-coding:utf-8 -*-
#画家可以画画
class Painter(object):
def working(self):
return "painter is working."
#歌手可以唱歌
class Singer(object):
def working(self):
return "singer is working."
#音乐家可以弹奏
class Pianist(object):
def working(self):
return "pianist is working."
#不管有多少角色,代码就这么多,是不是低耦合,很高效尼
class MovieAction(object):
def getAction(self, obj):
return obj.working()
if __name__ == "__main__":
movieAction = MovieAction()
print movieAction.getAction(Singer())
print movieAction.getAction(Pianist())
"""print out
singer is working.
pianist is working.
"""
网友评论