设计模式之外观模式

外观模式

定义

外观模式又称为门面模式。
其为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用。

特点
  1. 外观模式要求子系统内部和外部的通讯必须通过统一接口对象进行
  2. 外观模式提供一个高层次接口,使得子系统更容易使用
外观模式的应用举例

外观模式听起来似乎有点陌生,但是我们却经常能见到
-生活中实例
最初,我们想听音乐,需要有个mp3,看电影需要有个mp4,玩游戏需要有个游戏机。。。现在我们一台电脑就可以解决这些需求。
在这里,mp3、mp4和游戏机在电脑中都是一个完整的子功能系统 ,电脑就是整个系统的外观
-开发实例
ImageLoder、XUtils、Volley等等都使用了外观模式
如 XUitls框架:很多模块
例如:加载UI模块、下载文件模块、网络请求模块等等…

外观模式的角色
  1. 系统对外提供统一接口
  2. 子系统接口
外观模式的设计及实现

实例场景:我们设计一台电脑,该电脑有听音乐和玩游戏的功能
设计子系统:
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();
从使用上我们能看出,用户不需要关心子系统做了什么,只需要在整体系统中直接执行需要的命令即可,具体实现由子系统实现

猜你喜欢

转载自blog.csdn.net/rocky123shine/article/details/80049665