一分钟了解python的facade pattern
Facade Pattern 是一种常用的设计模式,它提供了一个简单的接口,用于访问复杂系统的子系统。这个模式可以使得系统更加易于使用和维护。在 Python 中,Facade Pattern 可以通过封装一组相关的类,来提供一个简单的接口,用于访问这些类的功能。
下面我们将用一个简单的例子来说明这个模式。
假设我们正在开发一个音乐播放器程序,它需要支持 MP3、FLAC 和 WAV 三种音频格式。我们需要设计一个程序,用于读取和播放这些音频文件,并提供一组简单的接口,供用户来控制播放器的功能。
我们首先定义一个外观类 MusicPlayerFacade,它封装了一组相关的类,用于读取和播放音频文件。这个类提供了一组简单的接口,用于控制播放器的功能。
class MusicPlayerFacade:
def __init__(self):
self.mp3_player = MP3Player()
self.flac_player = FLACPlayer()
self.wav_player = WAVPlayer()
def play(self, filename):
if filename.endswith('.mp3'):
self.mp3_player.play_mp3(filename)
elif filename.endswith('.flac'):
self.flac_player.play_flac(filename)
elif filename.endswith('.wav'):
self.wav_player.play_wav(filename)
else:
print(f'Unsupported format: {filename}')
def stop(self):
self.mp3_player.stop()
self.flac_player.stop()
self.wav_player.stop()
def volume_up(self):
self.mp3_player.volume_up()
self.flac_player.volume_up()
self.wav_player.volume_up()
def volume_down(self):
self.mp3_player.volume_down()
self.flac_player.volume_down()
self.wav_player.volume_down()
MusicPlayerFacade 类包含三个子系统类 MP3Player、FLACPlayer 和 WAVPlayer。这些类分别用于读取和播放 MP3、FLAC 和 WAV 格式的音频文件。这个外观类提供了一组简单的接口,用于控制播放器的功能,比如播放、停止、音量调节等。
接下来我们定义三个子系统类,它们分别用于读取和播放 MP3、FLAC 和 WAV 格式的音频文件,并提供相应的控制接口。
class MP3Player:
def play_mp3(self, filename):
print(f'Playing MP3: {filename}')
def stop(self):
print('MP3 stopped')
def volume_up(self):
print('MP3 volume up')
def volume_down(self):
print('MP3 volume down')
class FLACPlayer:
def play_flac(self, filename):
print(f'Playing FLAC: {filename}')
def stop(self):
print('FLAC stopped')
def volume_up(self):
print('FLAC volume up')
def volume_down(self):
print('FLAC volume down')
class WAVPlayer:
def play_wav(self, filename):
print(f'Playing WAV: {filename}')
def stop(self):
print('WAV stopped')
def volume_up(self):
print('WAV volume up')
def volume_down(self):
print('WAV volume down')
这些子系统类分别用于读取和播放 MP3、FLAC 和 WAV 格式的音频文件,并提供相应的控制接口,比如播放、停止、音量调节等。
最后,我们来测试这个程序。我们创建一个 MusicPlayerFacade 对象,并使用它来播放和控制音乐播放器的功能。
player = MusicPlayerFacade()
player.play('song.mp3')
player.volume_up()
player.play('song.flac')
player.stop()
这个程序将输出如下内容:
Playing MP3: song.mp3
MP3 volume up
Playing FLAC: song.flac
FLAC stopped
这个例子中,我们使用 Facade Pattern 来封装一组相关的类,用于读取和播放音频文件,并提供一组简单的接口,用于控制播放器的功能。这个模式使得音乐播放器更加易于使用和维护,而且也可以方便地扩展到支持更多的音频格式或者添加更多的控制接口。