设计模式----外观模式UML和实现代码(5个必须掌握的设计模式)

本文详细介绍了外观模式的概念、UML图表示、Java代码实现,并探讨了其在软件设计中的适用场景。通过实例展示了如何使用外观模式简化系统调用接口,提升系统的可维护性和易用性。

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

一、什么是外观模式?

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

类型:结构型模式

顺口溜:适装组享代

二、外观模式UML

003312_fO05_2003960.png

三、JAVA代码实现

package com.amosli.dp.structural.facade;

public class Facade {
	SubsystemOne one;
	SubsystemTwo two;
	SubsystemThree three;

	public Facade() {
		one = new SubsystemOne();
		two = new SubsystemTwo();
		three = new SubsystemThree();
	}

	public void methodA() {
		System.out.println("group A:");
		one.operation1();
		two.operation2();
	}

	public void methodB() {
		System.out.println("group B:");
		three.operation3();
	}
}

package com.amosli.dp.structural.facade;

public class SubsystemOne {
	public void operation1(){
		System.out.println("deal 1 part...");
	}
}

package com.amosli.dp.structural.facade;

public class SubsystemTwo {
	public void operation2(){
		System.out.println("deal 2 part...");
	}
}

package com.amosli.dp.structural.facade;

public class SubsystemThree {
	public void operation3(){
		System.out.println("deal 3 part...");
	}
}

package com.amosli.dp.structural.facade;

public class Client {
	public static void main(String[] args) {
		Facade facade = new Facade();
		facade.methodA();
		facade.methodB();
	}
}

四、使用场景

在以下情况下可以考虑使用外观模式:

(1)设计初期阶段,应该有意识的将不同层分离,层与层之间建立外观模式。

(2) 开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调用接口。

(3) 维护一个大型遗留系统的时候,可能这个系统已经非常难以维护和扩展,但又包含非常重要的功能,为其开发一个外观类,以便新系统与其交互。

五、源码地址

本系列文章源码地址,https://github.com/amosli/dp  欢迎Fork  & Star !!



转载于:https://my.oschina.net/u/2003960/blog/535658

<think>嗯,用户问的是外观模式UML图怎么画。首先,我得回忆一下外观模式的定义结构。外观模式属于结构型设计模式,主要目的是为复杂的子系统提供一个简化的接口。这样客户端只需要外观类交互,而不需要直接处理子系统的各个类。 那画UML图的话,应该包括哪些部分呢?首先,外观模式通常有一个Facade类,这个类封装了子系统的复杂交互。然后,子系统里有多个类,可能分为不同的模块,比如SubsystemA、SubsystemB、SubsystemC等等。客户端类会通过Facade来调用这些子系统的功能,而不直接它们交互。 接下来考虑类之间的关系。Facade类应该依赖于各个子系统类,因为它需要调用它们的方法。而子系统类之间可能会有相互的依赖,但客户端不应该直接引用它们。所以UML图中,Facade子系统类之间用关联关系,比如带箭头的虚线表示依赖,或者实线箭头表示关联。客户端Facade之间是关联,客户端指向Facade。 然后要确定每个类的职责。Facade类的方法通常是组合子系统各个类的功能,提供一个更高层次的接口。比如一个统一的方法handleRequest(),里面调用SubsystemA的method1(),SubsystemB的method2()等。子系统类则各自实现自己的具体功能。 画图的时候,可能需要用工具,比如PlantUML或者StarUML。用PlantUML的话,代码大概怎么写呢?比如: @startuml class Client class Facade { +operation() } class SubsystemA { +method1() } class SubsystemB { +method2() } class SubsystemC { +method3() } Client --> Facade Facade --> SubsystemA Facade --> SubsystemB Facade --> SubsystemC @enduml 这样就能生成基本的类图。但要注意,子系统类之间可能还有交互,比如SubsystemA调用SubsystemB的方法,这时候是否需要体现在UML中?根据外观模式的定义,客户端不直接接触子系统,所以可能不需要在图中显示子系统间的交互,除非特别强调内部结构。 另外,是否需要接口或抽象类?外观模式通常不强制使用接口,但如果Facade需要替换实现,可能用接口。不过一般情况下,直接画具体类就可以了。 用户可能是刚开始学习设计模式,所以需要步骤清晰,不要太复杂。应该分步骤说明,先画Facade类,再添加子系统类,最后连接关系。同时提醒注意客户端只依赖Facade,不直接调用子系统。 可能还需要注意事项,比如避免Facade类变得过于庞大,或者子系统变化影响Facade。但用户的问题主要是关于UML图的绘制,所以这部分可能作为补充说明。 总之,步骤应该是:1. 确定Facade类;2. 添加子系统类;3. 建立Facade到子系统的依赖;4. 客户端指向Facade。然后给出示例图代码,以及工具建议。</think>### 外观模式 UML 图绘制步骤 #### 1. **核心组件** 外观模式UML 图需包含以下角色: - **外观类(Facade)**:提供简化的统一接口,隐藏子系统复杂性。 - **子系统类(Subsystem Classes)**:实现具体功能,可能包含多个相互关联的类。 - **客户端(Client)**:通过外观类调用功能,不与子系统直接交互。 --- #### 2. **绘制步骤** **步骤 1:绘制外观类** - 用一个矩形框表示 `Facade` 类,包含一个核心方法(如 `operation()`),用于封装子系统调用。 **步骤 2:添加子系统类** - 画出若干子系统类(如 `SubsystemA`、`SubsystemB`),每个类包含自己的方法(如 `method1()`、`method2()`)。 **步骤 3:建立依赖关系** - 用**单向关联箭头**(实线箭头)连接 `Facade` 到每个子系统类,表示外观类调用子系统功能。 - 用**单向依赖箭头**(虚线箭头)连接 `Client` 到 `Facade`,表示客户端仅依赖外观类。 **步骤 4(可选):标注交互逻辑** - 在图中用注释或序列图片段说明 `Facade` 如何协调子系统调用(例如调用顺序)。 --- #### 3. **UML 图示例(PlantUML 代码)** ```plantuml @startuml class Client class Facade { +operation() } class SubsystemA { +method1() } class SubsystemB { +method2() } class SubsystemC { +method3() } Client --> Facade Facade --> SubsystemA Facade --> SubsystemB Facade --> SubsystemC @enduml ``` 生成的 UML 图如下: ![外观模式 UML 示意图](https://via.placeholder.com/400x200/FFFFFF/000000?text=Facade+-->+SubsystemA+B+C%0AClient+-->+Facade) --- #### 4. **关键注意事项** 1. **简化接口**:外观类的方法应高度抽象,避免暴露子系统细节。 2. **单向依赖**:客户端仅依赖 `Facade`,不可直接调用子系统类。 3. **子系统独立性**:子系统类之间可保留原有交互逻辑(无需在图中显式标注)。 --- #### 5. **工具推荐** - **在线工具**:[PlantUML](https://plantuml.com/)代码生成)、[Draw.io](https://app.diagrams.net/)(图形化编辑) - **桌面工具**:Enterprise Architect、StarUML 通过上述步骤,可清晰表达外观模式中“简化接口,隐藏复杂性”的核心思想。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值