外观模式,,,

还有三个模式就结束 结构型模式了,

视频已经过半了

最后一个行为模式,

一共23个,

创建型 5 个 ,  单例,工厂,抽象工厂,原型,建造者

结构型 7 个,代理,装饰器,适配器,桥接,

行为型, 11 个 ,

理解了就行,过一遍就行,不会一无所知就行

然后是 jvm

设计模式

设计模式可以分为三大类:创建型结构型行为型。你提到的这些模式属于这些分类,具体情况如下:

1. 创建型模式(5个)

创建型模式主要关注对象创建的过程,帮助在不同的情境下创建对象时提高灵活性和可扩展性。

  • 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。
  • 工厂模式(Factory):通过一个工厂方法来创建对象,而不是直接使用构造函数。
  • 抽象工厂模式(Abstract Factory):提供一个接口,用于创建一系列相关或依赖对象的工厂。
  • 原型模式(Prototype):通过复制现有的实例来创建新的对象,而不是重新创建一个新的对象。
  • 建造者模式(Builder):将一个复杂对象的构建过程分解为多个步骤,允许逐步构建不同的对象。
2. 结构型模式(7个)

结构型模式主要关注如何将类和对象组合成更大的结构,通常涉及到继承和组合。

  • 代理模式(Proxy):通过代理对象控制对原始对象的访问,可以进行延迟加载、权限控制等。
  • 装饰器模式(Decorator):通过动态地给对象增加额外的功能,而不修改原有代码。
  • 适配器模式(Adapter):将一个类的接口转换成客户端希望的接口,使原本不兼容的接口可以协同工作。
  • 桥接模式(Bridge):将抽象部分与实现部分分离,使得两者可以独立变化,通常用于处理复杂的层次结构。
3. 行为型模式(11个)

行为型模式主要关注对象之间的交互和责任分配,适用于不同对象之间协作和通信的场景。

  • 责任链模式(Chain of Responsibility)
  • 命令模式(Command)
  • 解释器模式(Interpreter)
  • 迭代器模式(Iterator)
  • 中介者模式(Mediator)
  • 备忘录模式(Memento)
  • 观察者模式(Observer)
  • 状态模式(State)
  • 策略模式(Strategy)
  • 模板方法模式(Template Method)
  • 访问者模式(Visitor)

JVM相关知识

JVM(Java虚拟机)是Java程序运行的环境,它提供了跨平台的能力。以下是一些你可能需要了解的关键点:

  1. JVM架构:JVM由多个部分组成,包括类加载器、运行时数据区、执行引擎、垃圾回收器等。
  2. 内存管理
    • 堆(Heap):存储所有对象实例。
    • 栈(Stack):存储方法调用和局部变量。
    • 方法区(Method Area):存储类信息、常量、静态变量等数据。
  3. 垃圾回收:JVM自动进行内存管理,垃圾回收器回收不再使用的对象,减少内存泄漏和溢出的风险。
  4. 字节码:Java编译器将Java源代码编译成字节码,JVM解释或即时编译字节码为机器代码来执行。

你提到“过一遍就行,不会一无所知就行”,如果是为了对设计模式和JVM有一个大致的了解,这样的学习方式是有效的。你可以先了解每个模式的核心思想和适用场景,之后再深入研究具体的实现。对于JVM,掌握内存管理和垃圾回收机制也是非常重要的。

外观模式,很简单

外观模式(Facade Pattern)

定义:
外观模式(Facade Pattern)是结构型设计模式的一种,旨在为复杂的子系统提供一个统一的接口,使得客户端通过这个简单的接口与复杂的子系统进行交互。外观模式隐藏了系统的复杂性,提供一个简洁的接口,让客户端只需要了解外观类,而不需要了解子系统的内部实现细节。

适用场景:

  • 当你需要为复杂的系统提供一个简单的接口。
  • 当系统的各个模块或类之间的耦合度较高时,外观模式可以减少客户端与子系统之间的直接交互,从而降低耦合度。
  • 当客户端只关心子系统的功能,而不需要知道其实现时。

组成:

外观模式主要由以下角色组成:

  1. 外观类(Facade):为客户端提供简单的接口,隐藏子系统内部的复杂性。
  2. 子系统类(Subsystem):实现具体的功能逻辑,子系统的类通常是一些细节实现,外部类通过外观类与它们进行交互。

优缺点:

优点:

  • 简化客户端代码:客户端只需要和外观类打交道,而不需要直接和子系统的复杂类进行交互。
  • 解耦:外观模式减少了客户端和子系统之间的耦合,使得子系统的修改对客户端的影响最小。
  • 便于维护:将复杂的子系统进行封装,减少了系统的复杂度,便于系统的维护和扩展。

缺点:

  • 外观类可能变得过于庞大:如果子系统非常复杂,外观类可能会变得非常大,甚至违反单一职责原则。
  • 无法替代子系统中的功能:外观模式将一些功能隐藏起来,但并不改变子系统本身的复杂性,如果客户端需要更细粒度的控制,可能不适合使用外观模式。

示例代码:

假设我们有一个家庭影院系统,其中包括了多个复杂的子系统,如音响、投影仪、DVD播放器等。使用外观模式可以为家庭影院系统提供一个简洁的操作接口。

// 子系统1:音响
class AudioSystem {
    public void on() {
        System.out.println("Audio system is on.");
    }
    public void off() {
        System.out.println("Audio system is off.");
    }
    public void setVolume(int volume) {
        System.out.println("Audio system volume set to " + volume);
    }
}

// 子系统2:投影仪
class Projector {
    public void on() {
        System.out.println("Projector is on.");
    }
    public void off() {
        System.out.println("Projector is off.");
    }
    public void setInput(String input) {
        System.out.println("Projector input set to " + input);
    }
}

// 子系统3:DVD播放器
class DVDPlayer {
    public void on() {
        System.out.println("DVD Player is on.");
    }
    public void off() {
        System.out.println("DVD Player is off.");
    }
    public void play(String movie) {
        System.out.println("Playing movie: " + movie);
    }
    public void stop() {
        System.out.println("Stopping movie.");
    }
}

// 外观类:家庭影院外观
class HomeTheaterFacade {
    private AudioSystem audioSystem;
    private Projector projector;
    private DVDPlayer dvdPlayer;

    public HomeTheaterFacade(AudioSystem audio, Projector projector, DVDPlayer dvdPlayer) {
        this.audioSystem = audio;
        this.projector = projector;
        this.dvdPlayer = dvdPlayer;
    }

    public void watchMovie(String movie) {
        System.out.println("Get ready to watch a movie...");
        projector.on();
        projector.setInput("DVD");
        audioSystem.on();
        audioSystem.setVolume(5);
        dvdPlayer.on();
        dvdPlayer.play(movie);
    }

    public void endMovie() {
        System.out.println("Shutting down movie theater...");
        dvdPlayer.stop();
        dvdPlayer.off();
        audioSystem.off();
        projector.off();
    }
}

// 客户端代码
public class FacadePatternExample {
    public static void main(String[] args) {
        AudioSystem audio = new AudioSystem();
        Projector projector = new Projector();
        DVDPlayer dvdPlayer = new DVDPlayer();

        HomeTheaterFacade homeTheater = new HomeTheaterFacade(audio, projector, dvdPlayer);

        // 客户端调用外观类的方法
        homeTheater.watchMovie("Inception");
        System.out.println("Movie is playing...");
        homeTheater.endMovie();
    }
}

运行结果:

Get ready to watch a movie...
Projector is on.
Projector input set to DVD
Audio system is on.
Audio system volume set to 5
DVD Player is on.
Playing movie: Inception
Movie is playing...
Shutting down movie theater...
Stopping movie.
DVD Player is off.
Audio system is off.
Projector is off.

分析:

  • 子系统类(AudioSystem、Projector、DVDPlayer) 负责实际的功能实现,每个类都具有独立的操作方法。
  • 外观类(HomeTheaterFacade) 提供了 watchMovie 和 endMovie 方法,客户端只需调用这两个方法来控制家庭影院的所有操作,而无需了解具体的细节(如音响的音量、投影仪的输入、DVD播放器的播放等)。

通过外观模式,客户端的代码更加简洁,系统的复杂度也被有效地封装和隐藏。

结论:

外观模式通过提供一个高层接口,简化了复杂系统的使用方式,降低了客户端与复杂子系统之间的耦合度。它适用于子系统相对复杂,且客户端只需要执行一系列复杂操作时。

外观模式就是加一层封装。

可以理解外观模式(Facade Pattern)就是通过添加一层“封装”来简化复杂系统的使用。通过外观类,客户端可以避免直接与复杂子系统的各个部分交互,从而减少代码的复杂性和耦合度。

外观模式的核心思想是:将子系统的复杂性隐藏在外观类中,客户端只需要通过外观类提供的简单接口与系统进行交互,而不需要知道各个子系统内部的实现细节。

简单总结:

  • 封装:外观模式通过提供一个统一的接口,将复杂的操作封装成简单的方法,客户端调用时无需了解细节。
  • 简化使用:通过外观类,客户端的操作变得简单,避免了直接操作复杂的子系统。

这种封装不仅仅是代码的组织,还是设计上的一种简化。让客户端能够更容易地与系统交互,同时维护和扩展复杂的子系统变得更为高效。

例如在家庭影院的例子中,客户端无需关心音响、投影仪、DVD播放器如何操作,只需通过外观类调用 watchMovieendMovie,就可以轻松实现所有相关的操作。

比如自动售卖机,就是外观模式,提供了简单使用

自动售卖机可以视为一个典型的外观模式的应用。它将复杂的内部操作封装起来,提供一个简单且易于使用的界面,用户只需通过选择商品、付款等简单操作即可完成交易,而无需了解背后复杂的物品管理、库存控制、支付系统等细节。

自动售卖机作为外观模式的示例:

在自动售卖机的实现中,用户的交互非常简单,通常就是按下一个按钮,选择商品、付款、取货等步骤。但是,这个看似简单的操作背后涉及多个系统模块的协作,例如:

  • 硬币识别系统:用于识别并验证投币。
  • 商品库存管理系统:用于检查商品是否有库存。
  • 支付系统:处理现金或电子支付的操作。
  • 商品配送系统:将商品从库存中取出并交给用户。
  • 界面显示系统:显示商品信息、操作提示等。

这些模块和系统可能非常复杂,但通过外观模式,它们的细节被封装在一个统一的接口中。用户和客户端只需与这个简化的外观接口(自动售卖机的控制面板)进行交互。

结论:

通过外观模式,自动售卖机将复杂的内部逻辑(例如硬币验证、库存检查、支付处理等)封装在外部接口中,用户只需要通过简单的操作就能完成交易。这种方式使得用户与系统之间的交互更加简单,而不需要了解背后的复杂操作。

外观模式 也 符合 结构型, 就是 加一些 结构, 实现一些功能。

结构型模式概念

结构型设计模式关注的是如何将类或对象组合成更大的结构。结构型模式通过简化、重新组织和调整现有的组件,使得系统的结构更加清晰、更易于使用和维护。外观模式通过添加一个“外观”类来封装复杂的子系统结构,提供一个更简单的接口。

外观模式的作用

外观模式通过将复杂的子系统与外部代码分离,提供一个统一的高层接口,使得客户端代码不需要直接和复杂的子系统交互,从而简化了代码的结构。

外观模式的实现方式

外观模式通过创建一个外观类来隐藏复杂的子系统,它的主要任务是协调和调用各个子系统组件的功能,并将这些细节封装到一个易于使用的接口中。

外观模式的结构:
  1. Facade(外观类):提供高层次的接口,简化外部调用,隐藏复杂的实现。
  2. Subsystem(子系统类):实现具体的功能和业务逻辑,通常子系统是一些比较复杂的模块,外观类通过它们来提供服务。

外观模式的类图示例:

        +-----------------+
        |   Facade        | <--- 提供简化的接口
        +-----------------+
        | +methodA()      |
        | +methodB()      |
        +-----------------+
                |
   +------------+------------+
   |                         |
+-----------+           +-----------+
| SubsystemA |           | SubsystemB |
+-----------+           +-----------+
| +operation1() |       | +operation2() |
+-----------+           +-----------+

外观模式

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

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

介绍

意图

为一个复杂的子系统提供一个一致的高层接口。这样,客户端代码就可以通过这个简化的接口与子系统交互,而不需要了解子系统内部的复杂性。

主要解决的问题

  • 降低客户端与复杂子系统之间的耦合度。
  • 简化客户端对复杂系统的操作,隐藏内部实现细节。

使用场景

  • 当客户端不需要了解系统内部的复杂逻辑和组件交互时。
  • 当需要为整个系统定义一个清晰的入口点时。

实现方式

  • 创建外观类:定义一个类(外观),作为客户端与子系统之间的中介。
  • 封装子系统操作:外观类将复杂的子系统操作封装成简单的方法。

关键代码

  • Facade类:提供高层接口,简化客户端与子系统的交互。
  • 子系统类:实现具体的业务逻辑,被Facade类调用。

应用实例

  1. 医院接待:医院的接待人员简化了挂号、门诊、划价、取药等复杂流程。
  2. Java三层架构:通过外观模式,可以简化对表示层、业务逻辑层和数据访问层的访问。

优点

  1. 减少依赖:客户端与子系统之间的依赖减少。
  2. 提高灵活性:子系统的内部变化不会影响客户端。
  3. 增强安全性:隐藏了子系统的内部实现,只暴露必要的操作。

缺点

  • 违反开闭原则:对子系统的修改可能需要对外观类进行相应的修改。

使用建议

  • 在需要简化复杂系统访问时使用外观模式。
  • 确保外观类提供的方法足够简单,以便于客户端使用。

注意事项

  • 外观模式适用于层次化结构,可以为每一层提供一个清晰的入口。
  • 避免过度使用外观模式,以免隐藏过多的细节,导致维护困难。

结构

外观模式涉及以下核心角色:

  • 外观(Facade):

    • 提供一个简化的接口,封装了系统的复杂性。外观模式的客户端通过与外观对象交互,而无需直接与系统的各个组件打交道。
  • 子系统(Subsystem):

    • 由多个相互关联的类组成,负责系统的具体功能。外观对象通过调用这些子系统来完成客户端的请求。
  • 客户端(Client):

    • 使用外观对象来与系统交互,而不需要了解系统内部的具体实现。

过过过,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值