首页 > 编程语言 >JAVA设计模式-外观模式

JAVA设计模式-外观模式

时间:2022-10-06 12:46:12浏览次数:85  
标签:外观 12 xpyvip void blog println JAVA 设计模式 public

JAVA设计模式-外观模式

介绍

外观模式是一种结构型模式,主要是为了隐藏系统的复杂性,对外提供一个可以访问的接口,客户端只需要访问这个接口即可。例如:我们现在的智能家居中的场景,平常我们下班回家,需要打开电灯,烧水、拉上窗帘、打开电视、打开空调,需要做很多事情,但是现在我们只需要回家之后在家里控制中心中设置为回家模式,对应的相关电器会自动执行相关指令,我们不需要关注具体的每一件事情,只需要设置场景为回家模式即可。JAVA开发中的三层开发模式也体现了外观模式。

优点

  1. 提高了安全性,客户端不需要知道系统的具体实现以及内部的复杂关系。
  2. 降低了客户端和子系统的耦合度,提高了灵活性,客户端不需要随着子系统的变化而变化,解决了客户端和子系统的高耦合。

缺点

  1. 不符合"开闭原则",需要修改时比较麻烦。

角色

  1. Facade:外观角色,该类知道哪些子系统负责哪些功能,其中的方法可能与一个或者多个子系统相关联,客户端请求传递到外观角色,再传递到子系统。
  2. Subsystem:子系统,实现系统部分具体功能的类。
  3. Client:客户端,负责调用外观角色。

代码示例

ServiceAImpl

/**
 * All rights Reserved, Designed By monkey.blog.xpyvip.top
 *
 * @version V1.0
 * @Package com.xpyvip.designpattern.adapter.facade
 * @Description: 服务A-打开电灯
 * @Author: xpy
 * @Date: Created in 2022年10月06日 12:12 下午
 */
public class ServiceAImpl {
    public void funA(){
        System.out.println("打开电灯");
    }
}

ServiceBImpl

/**
 * All rights Reserved, Designed By monkey.blog.xpyvip.top
 *
 * @version V1.0
 * @Package com.xpyvip.designpattern.adapter.facade
 * @Description: 服务B-烧水
 * @Author: xpy
 * @Date: Created in 2022年10月06日 12:12 下午
 */
public class ServiceBImpl {
    public void funB(){
        System.out.println("烧水");
    }
}

ServiceCImpl

/**
 * All rights Reserved, Designed By monkey.blog.xpyvip.top
 *
 * @version V1.0
 * @Package com.xpyvip.designpattern.adapter.facade
 * @Description: 服务C-打开电视
 * @Author: xpy
 * @Date: Created in 2022年10月06日 12:12 下午
 */
public class ServiceCImpl {
    public void funC(){
        System.out.println("打开电视");
    }
}

ServiceDImpl

/**
 * All rights Reserved, Designed By monkey.blog.xpyvip.top
 *
 * @version V1.0
 * @Package com.xpyvip.designpattern.adapter.facade
 * @Description: 服务D-拉上窗帘
 * @Author: xpy
 * @Date: Created in 2022年10月06日 12:12 下午
 */
public class ServiceDImpl {
    public void funD() {
        System.out.println("拉上窗帘");
    }
}

ServiceEImpl

/**
 * All rights Reserved, Designed By monkey.blog.xpyvip.top
 *
 * @version V1.0
 * @Package com.xpyvip.designpattern.adapter.facade
 * @Description: 服务E-打开空调
 * @Author: xpy
 * @Date: Created in 2022年10月06日 12:12 下午
 */
public class ServiceEImpl {
    public void funE() {
        System.out.println("打开空调");
    }
}

SmartHomeFacade

/**
 * All rights Reserved, Designed By monkey.blog.xpyvip.top
 *
 * @version V1.0
 * @Package com.xpyvip.designpattern.adapter.facade
 * @Description: 外观角色
 * @Author: xpy
 * @Date: Created in 2022年10月06日 12:12 下午
 */
public class SmartHomeFacade {
    private ServiceAImpl serviceA;
    private ServiceBImpl serviceB;
    private ServiceCImpl serviceC;
    private ServiceDImpl serviceD;
    private ServiceEImpl serviceE;

    public SmartHomeFacade() {
        this.serviceA = new ServiceAImpl();
        this.serviceB = new ServiceBImpl();
        this.serviceC = new ServiceCImpl();
        this.serviceD = new ServiceDImpl();
        this.serviceE = new ServiceEImpl();
    }

    public void goHome(){
        System.out.println("回家模式");
        serviceA.funA();
        serviceB.funB();
        serviceC.funC();
        serviceD.funD();
        serviceE.funE();
    }

    public void rest(){
        System.out.println("放松模式");
        serviceC.funC();
        serviceD.funD();
        serviceE.funE();
    }
}

Client

/**
 * All rights Reserved, Designed By monkey.blog.xpyvip.top
 *
 * @version V1.0
 * @Package com.xpyvip.designpattern.adapter.facade
 * @Description: 客户端
 * @Author: xpy
 * @Date: Created in 2022年10月06日 12:19 下午
 */
public class Client {
    public static void main(String[] args) {
        SmartHomeFacade smartHomeFacade = new SmartHomeFacade();
        smartHomeFacade.goHome();
        System.out.println("===============");
        smartHomeFacade.rest();
    }
}

运行结果

image-20221006122529375

扩展

开闭原则

"开闭原则"是在面向对象编程的领域中,规定“软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的”,这意味着一个实体是允许在不改变它的源代码的前提下变更它的行为。

原文链接:https://monkey.blog.xpyvip.top/archives/java-she-ji-mo-shi---wai-guan-mo-shi

标签:外观,12,xpyvip,void,blog,println,JAVA,设计模式,public
From: https://www.cnblogs.com/aibianchengya/p/16757406.html

相关文章

  • Java 常量池
    常量池分类常量池可以分为:字节码常量池,运行时常量池,字符串常量池。字节码常量池(常量池表ConstantPoolTable)字节码常量池在Class文件中,用于存放编译期生成的各种字面......
  • 设计模式-构造器模式
    封装复杂对象的构造逻辑,那么这讲的话呢,实际上是这个builder模式,这个构造器模式就是builder,ok,那么这个builder模式所要实现的是一个什么场景呢,就是,是这样的,比如说我们现在要......
  • 设计模式之责任链模式
    责任链模式概念ChainofResponsibility isabehavioraldesignpatternthatletsyoupassrequestsalongachainofhandlers.Uponreceivingarequest,each......
  • 设计模式之命令模式
    命令模式概念Command isabehavioraldesignpatternthatturnsarequestintoastand-aloneobjectthatcontainsallinformationabouttherequest.Thistra......
  • JAVA1.8-SSL错误:javax.net.ssl.SSLHandshakeException: sun.security.validator.Valid
    问题现象JavaSpring应用发送数据报如下问题。2022-10-0610:04:19.068ERROR23100---[nio-8081-exec-1]o.a.c.c.C.[.[.[/].[dispatcherServlet]:Servlet.se......
  • Java中的抽象类与接口介绍
    在Java中什么时候应该选择抽象类而不是接口?接受挑战吧!了解这些Java语言元素之间的区别以及如何在你的程序中使用它们。在Java代码中,甚至在Java开发工具包(JDK)本身中,都有大量......
  • Java当中jvm运行时区域新生代、老年代、永久代和Garbage Collection垃圾回收机制【杭
       1、本地方法栈和程序计数器==》偏底层一般不会接触到2、方法区==》对应为永久代3、虚拟机栈(stack)==》对应为栈4、堆(heap)==》对应里面有新生代+老年代sta......
  • JavaScript回调函数
    在百度百科中,回调函数的定义就是一个被作为参数传递的函数。通俗地理解:我现在写一个函数,里面定义了函数A,那么函数A就是回调函数。以前我认为JavaScript不过是......
  • 今天重新学习java基础的时候遇到了一个好玩的问题。换了环境变量jdk还是显示原来版本
    今天学习ES,需要用到更高版本的jdk(我以前用的是1.8),所以要更改以前的jdk设置,总体步骤如下:1.下载jdk-11,解压2.打开环境变量配置,把以前配置的JAVA_HOME的改为新jdk-11的路径......
  • JavaScript水平滚动菜单切换
         完整代码<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><met......