首页 > 其他分享 >23种设计模式——外观模式

23种设计模式——外观模式

时间:2023-12-13 18:01:18浏览次数:28  
标签:外观 23 void System static println 设计模式 public out

今天我们讲解的是23种设计模式中外观模式。外观模式主要通过向现有的系统添加一个接口,来隐藏系统的复杂性。

概念:

外观模式是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。

特点:

优点:

  • 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。

  • 对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易。

  • 降低了大型软件系统中的编译依赖性,简化了系统在不同平台之间的移植过程,因为编译一个子系统不会影响其他的子系统,也不会影响外观对象。

缺点:

  • 增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。
类图分析:

image.png

代码:

影院灯光

package cn.ppdxzz.facade;

/**
 * Description:影院灯光
 */
public class TheaterLight {
    private static final TheaterLight INSTANCE = new TheaterLight();
    public static TheaterLight getInstance() {
        return INSTANCE;
    }
    public void on() {
        System.out.println("灯光开启");
    }
    public void off() {
        System.out.println("灯光关闭");
    }
    public void dim() {
        System.out.println("灯光变暗...");
    }
    public void bright() {
        System.out.println("灯光变亮...");
    }

}

爆米花

package cn.ppdxzz.facade;

/**
 * Description:爆米花
 */
public class Popcorn {
    private static final Popcorn INSTANCE = new Popcorn();
    public static Popcorn getInstance() {
        return INSTANCE;
    }
    public void on() {
        System.out.println("爆米花开始");
    }
    public void off() {
        System.out.println("爆米花结束");
    }
    public void pop() {
        System.out.println("正在爆爆米花...");
    }
}

屏幕

package cn.ppdxzz.facade;
/**
 * Description:屏幕
 */
public class Screen {
    private static final Screen INSTANCE = new Screen();
    public static Screen getInstance() {
        return INSTANCE;
    }
    public void up() {
        System.out.println("屏幕上拉");
    }
    public void down() {
        System.out.println("屏幕下拉");
    }
}

投影仪

package cn.ppdxzz.facade;

/**
 * Description:投影仪
 */
public class Projector {
    private static final Projector INSTANCE = new Projector();
    public static Projector getInstance() {
        return INSTANCE;
    }

    public void on() {
        System.out.println("投影仪开启");
    }
    public void off() {
        System.out.println("投影仪关闭");
    }
    public void focus() {
        System.out.println("投影仪正在投影...");
    }
}

立体声

package cn.ppdxzz.facade;

/**
 * Description:立体声
 */
public class Stereo {
    private static final Stereo INSTANCE = new Stereo();

    public static Stereo getInstance() {
        return INSTANCE;
    }

    public void on() {
        System.out.println("立体声开启");
    }

    public void off() {
        System.out.println("立体声关闭");
    }
}

客户端

package cn.ppdxzz.facade;

/**
 * Description:外观模式家庭电影院
 */
public class Client {
    public static void main(String[] args) {
        HomeTheater homeTheater = new HomeTheater();
        homeTheater.ready();
        homeTheater.play();
        homeTheater.pauseIng();
        homeTheater.end();
    }
}
总结:
  • 外观模式对外屏蔽了子系统的细节,因此外观模式降低了客户端对子系统使用的复杂性。
  • 当系统需要进行分层设计时,可以考虑使用 Facade 模式。

Java 体系的三层开发模式就是使用的这种外观模式的思想,这种设计模式还是非常有必要学习一下它的思想的。

标签:外观,23,void,System,static,println,设计模式,public,out
From: https://blog.51cto.com/u_16167640/8804898

相关文章

  • 2023-12-13:用go语言,密码是一串长度为n的小写字母,一则关于密码的线索纸条, 首先将字母a
    2023-12-13:用go语言,密码是一串长度为n的小写字母,一则关于密码的线索纸条,首先将字母a到z编号为0到25编号,纸条上共有n个整数ai,其中a1表示密码里第一个字母的编号,若i>1的话就表示第i个字母和第i-1个字母编号的差值,例如,a2就代表密码中第1个字母和第2个字母编号的差值,若密码是acb,那么纸......
  • [CSP-S 2023] 种树
    [CSP-S2023]种树Part-1特殊性质B将种树时间设为\(l\),结束时间为\(r\),则可以把数的高度记作:\[\sum_{i=l}^r\max(1,b_i+x\timesc_i)\]分类讨论:\(c_i\ge0\)可以表示为\(b_i\times(r-l+1)+\frac{(r-l+1)\times(r+l)}{2}\timesc_i\)\(......
  • [CSP-S 2023] 消消乐
    赛时想到了一个规律,当一个字符串的头和首相等,并且中间的字符串同样可以被消除的话,那么这个大字串也就可以被消除。虽然竭尽全力想到了这一点,不过还不知道如何实现,开始的想法是:先使用\(vector\)来记录每一个字母所在的分别的下标,然后先从两个相邻字母的开始找(因为这样必定是可......
  • 2023-12-13:用go语言,密码是一串长度为n的小写字母,一则关于密码的线索纸条, 首先将字母a
    2023-12-13:用go语言,密码是一串长度为n的小写字母,一则关于密码的线索纸条,首先将字母a到z编号为0到25编号,纸条上共有n个整数ai,其中a1表示密码里第一个字母的编号,若i>1的话就表示第i个字母和第i-1个字母编号的差值,例如,a2就代表密码中第1个字母和第2个字母编号的差值,若密码是acb,......
  • [CSP-S 2023] 密码锁
    [CSP-S2023]密码锁考场上我跟个\(somebody\)一样,一看就想:一眼乘法原理,乱搞写一下就出来了。当时我还算了一下暴力好像也不会超时,结果,每天在yz日以继日的颓废考试经验,我断定CSP-S是不会考这么\(!\)复杂的题目的,结果暴力出奇迹,就是枚举模拟。考试后,一看wc枚举,我断定我......
  • 2023.12.13日报
    最近事情比较多,写日报也有点怠惰了,主要是偶尔会忘记,简单总结一下这两天的工作首先是使用jfinal做大作业,实话说这玩意一开始我觉得并不好用,因为页面也很简陋,后端也有点看不懂但是在实际体验并且调用百度翻译和图像处理的api后,感觉用起来还可以,其实和springboot有点类似现在是已......
  • Solution Set 2023.12.13
    CF1736ESwapandTake设在第\(i\)次操作后产生贡献的值为初始序列的\(a_{p_i}\),可以发现产生的贡献的指针移动方式为每次向后移动\(1\),而通过交换数字最多可以使得某个数字每次向后移动\(1\),由此可以得出每次产生贡献的位置单调不减,即\(p_1\lep_2\le\cdots\lep_n\)......
  • 【2023-12-12】家庭分工
    20:00人们说得好,在耕种多年的田地里,一年又一年长出新的谷子;完全可以相信“从读过的旧书里”人们也一定能学到新的知识。                                                ......
  • 尊嘟假嘟?2023年人工智能行业新诞生10家独角兽,AIGC竟占近一半
    今年的AIGC持续热了一年,从王慧文等大佬的入局,到百度发布「文心一言」,各大巨头纷纷发布大模型产品,切实地给中国人工智能赛道的融资添了一把浓烈的火。回顾这即将过去的一整年,虽然2023年投融资整体行业遇冷,各种坏消息不断,但总体而言,AI行业融资的形势相对仍处于比较热门的状态。2......
  • 浅谈设计模式-工厂模式的设计思想以及细节问题(上篇)
    1什么是工厂模式?工厂模式,顾名思义,就是把将对象的实例化过程封装在工厂类中的方式。工厂负责生产相应的对象实例。一般分为两种工厂模式:简单工厂;抽象工厂优点:用户不需要解决具体的细节问题,利用工厂类进行生产产品细节;可以将对象的创建与使用代码分离,提供一种统一的接口来创建不同类......