首页 > 其他分享 >外观模式

外观模式

时间:2023-08-06 17:06:03浏览次数:27  
标签:外观 name 模式 Water new Teawater public String

**外观模式:**提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。

外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。

这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。

介绍

**意图:**为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

**主要解决:**降低访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口。

何时使用: 1、客户端不需要知道系统内部的复杂联系,整个系统只需提供一个”接待员”即可。 2、定义系统的入口。

**如何解决:**客户端不与系统耦合,外观类与系统耦合。

**关键代码:**在客户端和复杂系统之间再加一层,这一层将调用顺序、依赖关系等处理好。

应用实例: 1、去医院看病,可能要去挂号、门诊、划价、取药,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便。 2、JAVA 的三层开发模式。

优点: 1、减少系统相互依赖。 2、提高灵活性。 3、提高了安全性。

**缺点:**不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。

使用场景: 1、为复杂的模块或子系统提供外界访问的模块。 2、子系统相对独立。 3、预防低水平人员带来的风险。

**注意事项:**在层次化结构中,可以使用外观模式定义系统中每一层的入口。

实现

package HeadFirstDesignMode.facade;

import lombok.AllArgsConstructor;
import lombok.Data;

/**
 * 描述:外观模式
 */
public class FacadePattern {
    public static void main(String[] args) {
        TeaHouseFacade teaHouseFacade = new TeaHouseFacade("老舍茶馆");

        Man zhangsan = new Man("张三");
        Teawater teawater = teaHouseFacade.makeTea(1);
        zhangsan.drink(teawater);
        System.out.println();

        Man lisi = new Man("李四");
        Teawater teawater1 = teaHouseFacade.makeTea(2);
        lisi.drink(teawater1);
    }

}

@Data
@AllArgsConstructor
class Water {
    private int temperature;    // 温度
    private int capacity;       // 容量
    public Water() {
        this.temperature = 0;
        this.capacity = 10;
    }
}
@Data
@AllArgsConstructor
class TeaLeaf {
    private String teaName;
}
@Data
@AllArgsConstructor
class Teawater{
    private String teaWater;
}
class KettleService {
    public void waterBurning(String who, Water water, int burnTime) {
        // 烧水,计算最终温度
        int finalTermperature = Math.min(100, water.getTemperature() + burnTime * 20);
        water.setTemperature(finalTermperature);
        System.out.println(who + " 使用水壶烧水,最终水温为 " + finalTermperature);
    }
}

class TeasetService {
    public Teawater makeTeaWater(String who, Water water, TeaLeaf teaLeaf) {
        String teawater = "一杯容量为 " + water.getCapacity() + ", 温度为 " + water.getTemperature() + " 的" + teaLeaf.getTeaName() + "茶水";
        System.out.println(who + " 泡了" + teawater);
        return new Teawater(teawater);
    }
}
class Man {
    private String name;
    public Man(String name) {
        this.name = name;
    }
    public void drink(Teawater teawater) {
        System.out.println(name + " 喝了" + teawater.getTeaWater());
    }
}

class TeaHouseFacade {
    private String name;
    private TeasetService teasetService;
    private KettleService kettleService;

    public TeaHouseFacade(String name) {
        this.name = name;
        this.teasetService = new TeasetService();
        this.kettleService = new KettleService();
    }

    public Teawater makeTea(int teaNumber) {
        switch (teaNumber) {
            case 1:
                Water water1 = new Water();
                TeaLeaf teaLeaf1 = new TeaLeaf("西湖龙井");
                kettleService.waterBurning(this.name, water1, 4);
                Teawater teawater1 = teasetService.makeTeaWater(this.name, water1, teaLeaf1);
                return teawater1;
            case 2:
                Water water2 = new Water(10, 15);
                TeaLeaf teaLeaf2 = new TeaLeaf("碧螺春");
                kettleService.waterBurning(this.name, water2, 4);
                Teawater teawater2 = teasetService.makeTeaWater(this.name, water2, teaLeaf2);
                return teawater2;
            default:
                Water water3 = new Water();
                TeaLeaf teaLeaf3 = new TeaLeaf("招牌乌龙");
                kettleService.waterBurning(this.name, water3, 5);
                Teawater teawater3 = teasetService.makeTeaWater(this.name, water3, teaLeaf3);
                return teawater3;
        }
    }
}

标签:外观,name,模式,Water,new,Teawater,public,String
From: https://blog.51cto.com/u_11906056/6985089

相关文章

  • 模板方法模式
    **模板方法模式:**在一个方法中定义一个算法的骨架,现将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。在模板模式(TemplatePattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象......
  • 常见的电商模式 B2B、B2B、C2B、C2C、O2O
    1电商模式市面上有5种常见的电商模式B2B、B2B、C2B、C2C、O2O1.1B2B模式B2B(BusinesstoBusiness),是指商家和商家建立的商业关系,如阿里,1.2B2C模式B2C(BusinesstoConsumer)就是我们经常看到的供应商直接把商品买个用户,即“商对客”模式,也就是我们呢说的商业零售......
  • 策略模式
    IfyoucanNOTexplainitsimply,youdoNOTunderstanditwellenough**介绍:**定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户**主要解决:**在有多种算法相似的情况下,使用if…else所带来的复杂和难以维护。**何时使用:**一个系......
  • 观察者模式
    **介绍:**定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖都会收到通知并自动更新。**主要解决:**一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。**何时使用:**一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得......
  • 装饰者模式
    装饰者模式**装饰者模式:**动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。*设计原则:*类应该对扩展开放,对修改关闭继承属于扩展形式之一,但不见得是达到弹性设计的最佳方式。在我们的设计中,应该允许行为可以被扩展,而无须修改现有的代码。组合和......
  • 工厂方法模式
    工厂方法模式**工厂方法模式:**定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。设计原则:依赖倒置原则:要依赖抽象,不要依赖具体类。下面的指导方针,能避免在OO设计原则中违反依赖倒置原则:变量不可以持有具体的类的引用。不要让......
  • 【Java】智慧工地管理系统源码(SaaS模式)
    智慧工地是聚焦工程施工现场,紧紧围绕人、机、料、法、环等关键要素,综合运用物联网、云计算、大数据、移动计算和智能设备等软硬件信息技术,与施工生产过程相融合。一、什么是智慧工地智慧工地是指利用移动互联、物联网、智能算法、地理信息系统、大数据挖掘分析等信息技术,提高项目......
  • openGauss学习笔记-32 openGauss 高级数据管理-批处理模式
    openGauss学习笔记-32openGauss高级数据管理-批处理模式openGauss支持从文本文件执行SQL语句。openGauss提供了gsql工具实现SQL语句的批量处理。以下场景建议使用批处理:如果您重复运行查询(例如,每天或每周),将其设为脚本可以让您避免每次进行重复输入。您可以通过复制和编辑脚......
  • C++工厂模式简易实现
    C++工厂模式简易实现引言:动态绑定是面向对象编程的重要功能,但C++目前还没有纳入标准库的反射机制,所以为了更方便的动态构造对象,使得通过配置文件的方式改变派生类对象,而不需要去修改代码,所以可以使用工厂这一常见的设计模式,来完成类对象的动态构造。基于C++11的新特性和模板,实现......
  • C#中CLR核心机制解析:垃圾回收与标准Dispose模式
    一、CLR核心机制1.1-创建对象的流程分配内存把对象传入到构造函数构造函数使用当前实例返回1.2-什么是堆/栈?堆-Heap:托管堆;一个程序运行时,该进程存放引用类型变量的一块内存,他是全局唯一的。栈-Stack:先进后出数据结构,线程栈;每一个线程存放变量和值类型的内存,随着线程......