外观模式 / 过程模式

基本介绍

1.外观模式,又称过程模式

2.原理:定义了一个高层接口,为子系统中的一组接口提供一个一致的接口(外观类),用以屏蔽内部子系统的细节,使得调用端只需调用高层接口,无需关心这个子系统的内部细节

 

角色

1.外观类(Facade):为调用端提供统一的调用接口,外观类知道不同子系统负责处理何种请求,从而将调用端不同请求代理给适当的子系统对象

2.客户端:外观接口的调用者

3.子系统集合:指模块或者子系统,处理 Facade 对象指派的任务,是功能的实际提供者

 

事项

1.外观类、子系统都是具体类

2.外观类中组合多个子系统,两者非继承关系

3.优点

(1)对外屏蔽了子系统的细节,降低了客户端对子系统使用的复杂性,提高了安全性

(2)对客户端与子系统进行解耦,减少系统相互依赖,让子系统内部的模块更易维护和扩展,提高灵活性

(3)通过合理的使用外观模式,可以更好地划分访问的层次

4.应用场景

(1)子系统较复杂,系统需要进行分层设计,提供外界访问的模块;子系统较简单时,直接调用即可,无需外观模式

(2)维护一个遗留的大型系统时,可能该系统已经变得非常难以维护和扩展,为新系统开发 Facade,Facade 保留旧系统的可用方法,由新系统调用 Facade

 

外观模式、命令模式

1.外观模式

(1)简化操作,封装内部,不符合开闭原则,新增需要修改外观类

(2)外观模式无法穿透外观类(或接口)去细粒度的控制内部的执行顺序或某些特殊的逻辑,像只有一个按钮的遥控器,这一个按钮执行多个设定好顺序的开关操作,并且中间不能撤回

2.命令模式

(1)对命令调用者和命令执行者进行解耦,符合开闭原则

(2)命令模式能细粒度的控制每个按钮的执行顺序,像一个多按钮的遥控器,每个按钮是一个命令,使用某些按钮进行开关操作,还支持等待执行、执行撤回等操作

 

代码示例

public class Facade {//客户端

    public static void main(String[] args) {
        Theater theater = new Theater();
        theater.play();
        theater.end();
    }
}

class Theater {//外观类
    private Screen screen;
    private Player player;
    private Stereo stereo;

    public Theater() {
        this.screen = Screen.getScreen();
        this.player = Player.getPlayer();
        this.stereo = Stereo.getStereo();
    }

    public void play() {
        screen.down();
        player.start();
        stereo.start();
    }

    public void end() {
        screen.up();
        player.end();
        stereo.end();
    }
}

class Screen {//子系统
    //饿汉式(静态常量)
    private static final Screen SCREEN = new Screen();

    private Screen() {
    }

    public static Screen getScreen() {
        return SCREEN;
    }

    public void down() {
        System.out.println("降下屏幕");
    }

    public void up() {
        System.out.println("升起屏幕");
    }
}

class Player {//子系统
    //饿汉式(静态常量)
    private static final Player PLAYER = new Player();

    private Player() {
    }

    public static Player getPlayer() {
        return PLAYER;
    }

    public void start() {
        System.out.println("播放视频");
    }

    public void end() {
        System.out.println("停止视频");
    }
}

class Stereo {//子系统
    //饿汉式(静态常量)
    private static final Stereo STEREO = new Stereo();

    private Stereo() {
    }

    public static Stereo getStereo() {
        return STEREO;
    }

    public void start() {
        System.out.println("播放音频");
    }

    public void end() {
        System.out.println("停止音频");
    }
}

 

posted @   半条咸鱼  阅读(128)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体
点击右上角即可分享
微信分享提示