外观模式
定义
外观模式又称为门面模式。
其为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用。
特点
- 外观模式要求子系统内部和外部的通讯必须通过统一接口对象进行
- 外观模式提供一个高层次接口,使得子系统更容易使用
外观模式的应用举例
外观模式听起来似乎有点陌生,但是我们却经常能见到
-生活中实例
最初,我们想听音乐,需要有个mp3,看电影需要有个mp4,玩游戏需要有个游戏机。。。现在我们一台电脑就可以解决这些需求。
在这里,mp3、mp4和游戏机在电脑中都是一个完整的子功能系统 ,电脑就是整个系统的外观
-开发实例
ImageLoder、XUtils、Volley等等都使用了外观模式
如 XUitls框架:很多模块
例如:加载UI模块、下载文件模块、网络请求模块等等…
外观模式的角色
- 系统对外提供统一接口
- 子系统接口
外观模式的设计及实现
实例场景:我们设计一台电脑,该电脑有听音乐和玩游戏的功能
设计子系统:
1)听音乐,提供听音乐子系统的接口,并实现
//接口
ublic interface IMusicServer {
void start();
void running(String musicName);
void stop();
}
//具体类实现
public class MusicServerImpl implements IMusicServer {
@Override
public void start() {
Log.i("main", "开始听音乐");
}
@Override
public void running(String musicName) {
Log.i("main", "听《" + musicName + "》歌曲");
}
@Override
public void stop() {
Log.i("main", "停止听音乐");
}
}
2)玩游戏,提供游戏子系统接口 并实现
接口
public interface IGameServer {
void start();
void running();
void stop();
}
实现
public class GameServerImpl implements IGameServer {
@Override
public void start() {
Log.i("main", "开始游戏");
}
@Override
public void running() {
Log.i("main", "运行游戏");
}
@Override
public void stop() {
Log.i("main", "停止游戏");
}
}
整体系统设计与实现:(为客户端提供一个整体的统一的接口)
public class Computer {
//外观模式重要特点:持有子系统引用(高层次接口)
private IGameServer gameServer = new GameServerImpl();
private IMusicServer musicServer = new MusicServerImpl();
public void startGame(){
gameServer.start();
gameServer.running();
}
public void stopGame(){
gameServer.stop();
}
public void startMusic(String musicName){
musicServer.start();
musicServer.running(musicName);
}
public void stopMusic(){
musicServer.stop();
}
}
使用:
Computer computer = new Computer();
computer.startGame();
computer.stopGame();
computer.startMusic("阳光总在风雨后");
computer.stopMusic();
从使用上我们能看出,用户不需要关心子系统做了什么,只需要在整体系统中直接执行需要的命令即可,具体实现由子系统实现