首页 > 其他分享 >【设计模式与体系结构】结构型模式-外观模式

【设计模式与体系结构】结构型模式-外观模式

时间:2025-01-11 22:11:19浏览次数:1  
标签:sell void 模式 子系统 static new 设计模式 public 结构型

引言

昨夜见军帖,可汗大点兵,军书十二卷,卷卷有爷名。阿爷无大儿,木兰无长兄,愿为市鞍马,从此替爷征。东市买骏马,西市买鞍鞯,南市买辔头,北市买长鞭。————《木兰诗 节选》

花木兰替父从军,欲买马、鞍鞯、辔头和长鞭,需要分别去往东市、西市、南市和北市。换言之,花木兰一人就得与四个贸易场所有贸易关系才能买到所需装备。被可汗大点兵的,自然不止花木兰一家,需要买马、鞍鞯、辔头和长鞭的,也必然不止花木兰一人,如果每个人都需要去到四个贸易场所并且都发生贸易关系,那么这个贸易关系显然会较为复杂。况且这还是知道去哪里贸易的情况,倘若所需贸易的物品不知所在之处,那贸易的复杂程度就更高了。倘若有一个供销社,能直接买到马、鞍鞯、辔头和长鞭,甚至其他装备,那么每个被点兵且需要买装备的人,只需要去供销社一个贸易场所即可,可以大大降低贸易的复杂度。

想要引入类似于供销社这种处理了各个子贸易场所的贸易关系的角色,这就要引入了结构型设计模式中的外观模式。

简介

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

外观模式的角色

  • 外观角色:这是外观模式的核心。它被客户角色调用,因此它熟悉子系统的功能。其内部根据客户角色已有的需求预定了集中功能组合
  • 子系统角色:实现子系统的功能。它和客户角色相互独立,彼此不知道彼此的任何信息
  • 客户角色:调用外观角色得到想要的功能

外观模式的优点

  1. 降低客户角色与子系统角色的耦合度
  2. 对客户屏蔽了子系统,减少了客户角色需要处理的对象数目,并且使得子系统用起来更加容易

外观模式的缺点

  1. 不符合开闭原则,若子系统发生变化,则外观模式可能也需要做出修改

正文

每个贸易场所都相当于一个子系统,定义一个子系统共有的贸易接口 Saleable.java

Saleable
public interface Saleable {
	void sell();
}

定义一个骏马贸易场所 HorseShop.java

HorseShop
public class HorseShop implements Saleable {

	@Override
	public void sell() {
		System.out.println("买骏马");
	}
	
}

定义一个鞍鞯贸易场所 SaddleShop.java

SaddleShop
public class SaddleShop implements Saleable {

	@Override
	public void sell() {
		System.out.println("买鞍鞯");
	}

}

定义一个辔头贸易场所 BriddleShop.java

BriddleShop
public class BridleShop implements Saleable {

	@Override
	public void sell() {
		System.out.println("买辔头");
	}

}

定义一个长鞭贸易场所 WhipShop.java

WhipShop
public class WhipShop implements Saleable {

	@Override
	public void sell() {
		System.out.println("买长鞭");
	}

}

定义一个客户类 Client.java

Client
public class Client {
	public static void main(String[] args) {
		func1();
		
		func2();
	}
	
	private static void func1() {
		HorseShop horseShop = new HorseShop();
		horseShop.sell();
		SaddleShop saddleShop = new SaddleShop();
		saddleShop.sell();
		BridleShop bridleShop = new BridleShop();
		bridleShop.sell();
		WhipShop whipShop = new WhipShop();
		whipShop.sell();
	}
	
	private static void func2() {
		SaddleShop saddleShop = new SaddleShop();
		saddleShop.sell();
		HorseShop horseShop = new HorseShop();
		horseShop.sell();
		WhipShop whipShop = new WhipShop();
		whipShop.sell();
        System.out.println("买口粮");
	}
}

从上述客户类代码可以看出,在不引入外观角色的情况下,客户类需要与各个子系统有着相对复杂的直接交互情况,客户类需要处理较多的对象。不妨再引入一个外观角色 ShopFacade.java

ShopFacade
public class ShopFacade {
	public static void buyHorse() {
		new HorseShop().sell();
	}
	
	public static void buySaddle() {
		new SaddleShop().sell();
	}
	
	public static void buyBridle() {
		new BridleShop().sell();
	}
	
	public static void buyWhip() {
		new WhipShop().sell();
	}
	
	public static void sellFood() {//供销社扩展的功能
		System.out.println("买口粮");
	}
}

外观角色可以封装各个子系统的对象功能,并且也可以扩展一定的功能。此时客户角色只需要执行以下代码就可以取代原来的功能:

Client
public class Client {
	
	public static void main(String[] args) {
		func1();
		
		func2();
	}
	
	private static void func1() {
		ShopFacade.buyHorse();
		ShopFacade.buySaddle();
		ShopFacade.buyBridle();
		ShopFacade.buyWhip();
	}
	
	private static void func2() {
		ShopFacade.buySaddle();
		ShopFacade.buyHorse();
		ShopFacade.buyWhip();
		ShopFacade.sellFood();
	}
}

如此一来,就实现了客户端与各个子系统之间的解耦,客户角色需要处理的对象数目就大大降低。

标签:sell,void,模式,子系统,static,new,设计模式,public,结构型
From: https://www.cnblogs.com/RomanLin/p/18665308

相关文章

  • 观察者设计模式:原理、应用与对比分析
    引言在软件工程中,设计模式是解决常见问题的经典方案。观察者设计模式(ObserverPattern)是一种行为型设计模式,用于在对象间建立一种一对多的依赖关系,使得当一个对象状态改变时,所有依赖它的对象都会收到通知并自动更新。本文旨在探讨观察者模式的基本原理、应用场景、具体案例,并与其......
  • springboot毕设 基于O2O模式的外卖订餐系统 程序+论文
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展和人们生活节奏的加快,O2O(OnlineToOffline)模式的外卖订餐系统逐渐成为人们日常生活中不可或缺的一部分。现代都市人的生活......
  • 如何开启苹果手机(IOS)系统的开发者模式?
    如何开启开发者模式?一、打开设置二、隐私与安全性三、找到开发者模式四、开启开发者模式------------------------------------------------------------如果发现没有开发者模式的选项一、电脑下载爱思助手二、连接手机三、工具箱——虚拟定位——打开虚拟定位——提示需......
  • COMMAND(命令)—对象行为型模式
    1.意图将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。2.别名动作(Action),事务(Transaction)3.动机有时必须向某对象提交请求,但并不知道关于被请求的操作或请求的接受者的任何信息......
  • CHAIN OF RESPONSIBILITY(职责链)—对象行为型模式
    1.意图使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。2.动机考虑一个图形用户界面中的上下文有关的帮助机制。用户在界面的任一部分上点击就可以得到帮助信息,所提供的帮......
  • vue3 + arcgis.js4.x---卷帘模式
    这里使用天地图的矢量图和影像图作为卷帘对比(tk自行申请)//初始化地图map:newMap({basemap:newBasemap({baseLayers:[newWebTileLayer('http://{subDomain}.tianditu.com/DataServer?T=vec_w&X={col}&Y={row}&L={level}&tk=',{......
  • Sigrity System SI SerialLink模式进行100base_T1协议仿真分析操作指导-100BaseT1_Rx
    SigritySystemSISerialLink模式进行100base_T1协议仿真分析操作指导-100BaseT1_RxSigritySystemSISerialLink模式提供了10个协议合规性检查工具模板,用户可以将根据实际应用替换模板中的SPICE文件,然后进行协议仿真分析,同时软件还提供了目标结果的模板MASK以及该协议需要......
  • Sigrity System SI SerialLink模式进行USB3.0协议仿真分析操作指导-SuperSpeed_Tx_Dev
    SigritySystemSISerialLink模式进行USB3.0协议仿真分析操作指导-SuperSpeed_Tx_DeviceSigritySystemSISerialLink模式提供了10个协议合规性检查工具模板,用户可以将根据实际应用替换模板中的SPICE文件,然后进行协议仿真分析,同时软件还提供了目标结果的模板MASK以及该协议......
  • 一个实例用全创建型模式-优化(冗余消除)
       上一篇:一个实例用全创建型模式-CSDN博客目录:《一个实例讲完23种设计模式》当前:单件+抽象工厂+创建者+工厂方法+优化需求:坦克大战创建两种坦克坦克类型   射程   速度b70   70米   时/70公里b50   50米   时/50公里设计说明1.抽......
  • 【IPVS】DR模式原理及其实验规划
    DR(路由模式)特点负载调度器和真实服务器,必须位于同一网络真实服务器的网关必须指向路由器负载调度只处理入站请求RIP可以是私有地址,也可以是公网地址真实服务器可以使用任意操作系统,负载调度器必须是LINUX系统优点:负载调度器压力较小缺点:配置相对复杂实现原理......