外观模式
文章目录
什么是外观模式
Facade 外观类
SubSystem Classes 子系统类集合
示例
外观模式(Facade Pattern)是一种结构设计模式,它为子系统中的一组接口提供了一个统一的高层接口,简化了外部对子系统的访问。以下是一个使用 Java 实现外观模式的示例,以简化对音乐播放系统的操作为例:
1.定义音乐播放系统中的各个子系统组件接口:
// 音乐播放器
public interface MediaPlayer {
// 播放
void play();
// 停止
void stop();
// 暂停
void pause();
}
public interface CDPlayer {
void playCD(String title);
void stopCD();
// 弹出
void ejectCD();
}
// 收音机
public interface Radio {
// 频道
void tuneFrequency(int frequency);
void turnOn();
void turnOff();
}
2.实现子系统组件:
public class CDPlayerImpl implements CDPlayer {
@Override
public void playCD(String title) {
System.out.println("Playing CD: " + title);
}
@Override
public void stopCD() {
System.out.println("Stopping CD playback.");
}
@Override
public void ejectCD() {
System.out.println("Ejecting CD.");
}
}
public class RadioImpl implements Radio {
@Override
public void tuneFrequency(int frequency) {
System.out.println("Tuning radio to frequency: " + frequency);
}
@Override
public void turnOn() {
System.out.println("Turning on the radio.");
}
@Override
public void turnOff() {
System.out.println("Turning off the radio.");
}
}
3.创建音乐播放系统的外观类(Facade),封装子系统组件的操作:
public class MusicPlayerFacade {
private CDPlayer cdPlayer;
private Radio radio;
public MusicPlayerFacade(CDPlayer cdPlayer, Radio radio) {
this.cdPlayer = cdPlayer;
this.radio = radio;
}
public void playCD(String title) {
cdPlayer.playCD(title);
}
public void stopMusic() {
cdPlayer.stopCD();
radio.turnOff();
}
public void playRadio(int frequency) {
radio.turnOn();
radio.tuneFrequency(frequency);
}
}
4.在客户端代码中,通过外观类 MusicPlayerFacade 简化对音乐播放系统的操作:
public class MusicPlayerDemo {
public static void main(String[] args) {
CDPlayer cdPlayer = new CDPlayerImpl();
Radio radio = new RadioImpl();
MusicPlayerFacade musicPlayer = new MusicPlayerFacade(cdPlayer, radio);
musicPlayer.playCD("My Favorite Album");
musicPlayer.stopMusic();
musicPlayer.playRadio(103.Ⅲ);
}
}
运行 MusicPlayerDemo 类的 main 方法,输出结果应为:
Playing CD: My Favorite Album
Stopping CD playback.
Turning off the radio.
Tuning radio to frequency: 103.Ⅲ
在这个示例中,MusicPlayerFacade 类作为外观角色,为 CDPlayer 和 Radio 子系统提供了简洁的接口,使得客户端无需直接与子系统交互,简化了系统的使用。