外观模式
文章目录
什么是外观模式
外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用
Facade 外观类
知道哪些子系统类负责处理请求,将客户的请求代理给适当的子系统对象
SubSystem Classes 子系统类集合
实现子系统的功能,处理Facade对象指派的任务。注意子类中没有Facade的任何信息,即没有对Facade对象的引用
示例
外观模式(Facade Pattern)是一种结构设计模式,它为子系统中的一组接口提供了一个统一的高层接口,简化了外部对子系统的访问。以下是一个使用 Java 实现外观模式的示例,以简化对音乐播放系统的操作为例:
1.定义音乐播放系统中的各个子系统组件接口:
java
// 音乐播放器
public interface MediaPlayer {
// 播放
void play();
// 停止
void stop();
// 暂停
void pause();
}
java
public interface CDPlayer {
void playCD(String title);
void stopCD();
// 弹出
void ejectCD();
}
java
// 收音机
public interface Radio {
// 频道
void tuneFrequency(int frequency);
void turnOn();
void turnOff();
}
2.实现子系统组件:
java
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.");
}
}
java
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),封装子系统组件的操作:
java
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 简化对音乐播放系统的操作:
java
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 子系统提供了简洁的接口,使得客户端无需直接与子系统交互,简化了系统的使用。