设计模式之(五)外观模式Facade

本文深入探讨了Facade模式在软件设计中的应用,通过一个汽车启动的例子,详细解释了如何通过Facade模式简化复杂子系统的接口,实现对外部客户程序的解耦。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Facade外观模式,是一种结构型模式,它主要解决的问题是:组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战。在这里我想举一个例子:比如,现在有一辆汽车,我们(客户程序)要启动它,那我们就要发动引擎(子系统1),使四个车轮(子系统2)转动。但是实际中我们并不需要用手推动车轮使其转动,我们踩下油门,此时汽车再根据一些其他的操作使车轮转动。油门就好比系统给我们留下的接口,不论汽车是以何种方式转动车轮,车轮变化成什么牌子的,我们要开走汽车所要做的还是踩下油门。

GoF《设计模式》中说道:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

Façade外观模式的结构大概是这样的:

       这个图是我对Facade模式的理解,如果大家觉得有什么不对的地方欢迎给我指出。

       我就上面说的那个情形写一下实现代码,首先我们要实现三个子系统(Wheel、Engine、Body):

internal class Engine { public string EngineWork() { return "BMW's Engine is Working"; } public string EngineStop() { return "BMW's Engine is stoped"; } } internal class Wheel { public string WheelCircumrotate() { return "BMW's Wheel is Circumrotating"; } public string WheelStop() { return "BMW's Wheel is stoped"; } } internal class Body { public Wheel[] wheels = new Wheel[4]; public Engine engine = new Engine(); public Body() { for (int i = 0; i < wheels.Length; i++) { wheels[i] = new Wheel(); } } }


然后,我们再来实现汽车的Facade

class CarFacade { Body body = new Body(); public void Run() { Console.WriteLine(body.engine.EngineWork()); for(int i = 0; i < body.wheels.Length; i++) { Console.WriteLine(body.wheels[i].WheelCircumrotate()); } } public void Stop() { Console.WriteLine(body.engine.EngineStop()); for (int i = 0; i < body.wheels.Length; i++) { Console.WriteLine(body.wheels[i].WheelStop()); } } }

 

现在我们来使用客户端程序验证一下,代码如下:

class Program { static void Main(string[] args) { CarFacade car = new CarFacade(); car.Run(); car.Stop(); Console.Read(); } }

     

       执行结果如下;

       BMW's Engine is Working

BMW's Wheel is Circumrotating

BMW's Wheel is Circumrotating

BMW's Wheel is Circumrotating

BMW's Wheel is Circumrotating

BMW's Engine is stoped

BMW's Wheel is stoped

BMW's Wheel is stoped

BMW's Wheel is stoped

BMW's Wheel is stoped

 

正如上面所说:客户端代码(Program)不需要关心子系统,它只需要关心CarFacade所留下来的和外部交互的接口,而子系统是在CarFacade中聚合。

 

Façade模式的几个要点:

       1、从客户程序的角度看,Facade模式不仅简化了整个组件系统的接口,同时对于组件内部与外部客户程序来说,从某种程度上也达到了一种“解耦”的效果——内部子系统的任何变化不会影响到Facade接口的变化。

2、Facade设计模式更注重从架构的层次去看整个系统,而不是单个类的层次。Facade很多时候更是一种架构设计模式。


转自http://www.cnblogs.com/kid-li/archive/2006/07/10/446904.html

转载于:https://www.cnblogs.com/moiyer/archive/2011/08/04/2316186.html

### 部署 Stable Diffusion 的准备工作 为了成功部署 Stable Diffusion,在本地环境中需完成几个关键准备事项。确保安装了 Python 和 Git 工具,因为这些对于获取源码和管理依赖项至关重要。 #### 安装必要的软件包和支持库 建议创建一个新的虚拟环境来隔离项目的依赖关系。这可以通过 Anaconda 或者 venv 实现: ```bash conda create -n sd python=3.9 conda activate sd ``` 或者使用 `venv`: ```bash python -m venv sd-env source sd-env/bin/activate # Unix or macOS sd-env\Scripts\activate # Windows ``` ### 下载预训练模型 Stable Diffusion 要求有预先训练好的模型权重文件以便能够正常工作。可以从官方资源或者其他可信赖的地方获得这些权重文件[^2]。 ### 获取并配置项目代码 接着要做的就是把最新的 Stable Diffusion WebUI 版本拉取下来。在命令行工具里执行如下指令可以实现这一点;这里假设目标路径为桌面下的特定位置[^3]: ```bash git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git ~/Desktop/stable-diffusion-webui cd ~/Desktop/stable-diffusion-webui ``` ### 设置 GPU 支持 (如果适用) 当打算利用 NVIDIA 显卡加速推理速度时,则需要确认 PyTorch 及 CUDA 是否已经正确设置好。下面这段简单的测试脚本可以帮助验证这一情况[^4]: ```python import torch print(f"Torch version: {torch.__version__}") if torch.cuda.is_available(): print("CUDA is available!") else: print("No CUDA detected.") ``` 一旦上述步骤都顺利完成之后,就可以按照具体文档中的指导进一步操作,比如调整参数、启动服务端口等等。整个过程中遇到任何疑问都可以查阅相关资料或社区支持寻求帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值