笨蛋学设计模式结构型模式-装饰者模式【10】

发布时间:2024年01月17日

7.4外观模式??????

7.4.1概念

? 外观模式也称门面模式,外观模式定义了一个高层接口,该接口为子系统中的一组接口提供一个统一的接口,从而简化了子系统的使用。同时隐藏了子系统内部的复杂性,并向客户端提供了一个更简单的接口,使得子系统变得更加容易。

7.4.2场景

? 当我们想看电视时,在电视上或者电视遥控器上都有一个电源启动 / 关闭按钮,这个按钮掩盖了电视机内部的所有复杂性,当我们想看电视时按下遥控器上的电源启动按钮,或者想调整电视音量时,又或者想调换电视节目等,也是通过电视遥控器上的某一个按钮来控制电视机,完成对应的电视复杂操作。

7.4.3优势 / 劣势

  • 简化代码:提高了代码的可读性以及可维护性
  • 提高代码重用性:对子系统进行修改时,只需要修改外观类
  • 模块化设计:将子系统封装在一个外观对象中,可以更容易地进行模块化设计和维护

  • 过度抽象:若过度抽象,可能会隐藏子系统的重要信息,导致难以进行有效的调试和维护
  • 性能影响:由于多了一层封装,可能会对性能产生一定的影响

7.4.4外观模式可分为

  • 外观类:对外提供一个统一的高层次接口,使复杂的子系统变得更易使用
  • 子系统类:实现子系统的功能,处理外观类指派的任务

7.4.5外观模式

package com.technologystatck.designpattern.mode.appearance;

public class Appearance {
    public static void main(String[] args) {
        //创建外观对象
        Facade facade = new Facade();

        //客户端通过外观类调用子系统的操作
        facade.facadeOperation();
    }
}

//子系统A
class SubsystemA{
    public void operationA(){
        System.out.println("SubsystemA operation");
    }
}

//子系统B
class SubsystemB{
    public void operationB(){
        System.out.println("SubsystemB operation");
    }
}

//子系统C
class SubsystemC{
    public void operationC(){
        System.out.println("SubsystemC operation");
    }
}

//外观类
class Facade{
    private SubsystemA subsystemA;
    private SubsystemB subsystemB;
    private SubsystemC subsystemC;

    //实例化三个子系统
    public Facade() {
        this.subsystemA = new SubsystemA();
        this.subsystemB = new SubsystemB();
        this.subsystemC = new SubsystemC();
    }

    //外观方法,封装了对子系统的操作
    public void facadeOperation(){
        subsystemA.operationA();
        subsystemB.operationB();
        subsystemC.operationC();
    }
}

7.4.6实战

7.4.6.1题目描述

小明家的电源总开关控制了家里的三个设备:空调、台灯和电视机。每个设备都有独立的开关密码,分别用数字1、2和3表示。即输入1时,空调关闭,输入2时,台灯关闭,输入3时,电视机关闭,当输入为4时,表示要关闭所有设备。请你使用外观模式编写程序来描述电源总开关的操作。

7.4.6.2输入描述

第一行是一个整数 N(1 <= N <= 100),表示后面有 N 行输入。

接下来的 N 行,每行包含一个数字,表示对应设备的开关操作(1表示关闭空调,2表示关闭台灯,3表示关闭电视机,4表示关闭所有设备)。

7.4.6.3输出描述

输出关闭所有设备后的状态,当输入的数字不在1-4范围内时,输出Invalid device code.

7.4.6.4实战
package com.technologystatck.designpattern.mode.appearance;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int nums = scanner.nextInt();
//        scanner.nextLine();
        //创建外观类对象,也就是电源开关
//        PowerFacade powerFacade =null;
//        for(int i=0;i<nums;i++){
//            int systemType = scanner.nextInt();
//            powerFacade= new PowerFacade();
//            powerFacade.facadeOperation(systemType);
//        }

        //定义数组存放用户输入
        int[] inputs=new int[nums];
        for(int i=0;i<nums;i++){
            inputs[i]=scanner.nextInt();
        }

        //创建外观类对象,也就是电源开关
        PowerFacade powerFacades=new PowerFacade();
        for(int j=0;j<nums;j++){
            powerFacades.facadeOperation(inputs[j]);
        }
    }
}

//创建三个子系统
//电视机子系统
class Television{
    public void operationTV(){
        System.out.println("Television is turned off.");
    }
}
//空调子系统
class AirConditioner{
    public void operationAC(){
        System.out.println("Air Conditioner is turned off.");
    }
}

//台灯子系统
class TableLamp{
    public void operationTL(){
        System.out.println("Table Lamp is turned off.");
    }
}

//创建外观类,来操控三个子系统
class PowerFacade{
    private Television television;
    private AirConditioner airConditioner;
    private TableLamp tableLamp;

    //实例化三个子系统
    public PowerFacade(){
        this.television=new Television();
        this.airConditioner=new AirConditioner();
        this.tableLamp=new TableLamp();
    }

    //外观方法,封装了对子系统的操作
    public void facadeOperation(int type){
        if(type==1){
            television.operationTV();
        }else if (type ==2 ) {
            this.airConditioner.operationAC();
        }else if(type==3){
            tableLamp.operationTL();
        }else if(type==4){
            System.out.println("All devices are off.");
        }else{
            System.out.println("Invalid device code.");
        }
    }
}

7.4.7总结

  • 外观模式

  • 优点:隐藏系统的内部细节,简化复杂的子系统,只需要通过已经封装好了的方法去调用

  • 总结:将一个或多个难度过于复杂的子系统包装为一个单独的接口,以供客户端只需要与外观对象交互

  • 场景

    • 当系统的接口过于复杂时,可以使用外观模式将系统的接口进行封装,让客户端调用简单的方法完成操作
    • 当系统存在多个子系统,且子系统之间存在依赖时,外观模式可以将不同子系统之间的依赖关系进行解耦
文章来源:https://blog.csdn.net/YSL_Monet/article/details/135608643
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。