JAVA设计模式之外观模式(六)

2024-09-01 01:38

本文主要是介绍JAVA设计模式之外观模式(六),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

所有设计模式传送门

一个大的系统一般都由若干个子系统构成,每个子系统包含多个类,这些类协同合作为用户提供所需要的功能。一个客户程序中的某个类的实例如果直接和子系统的多各类的实例打交道完成某项任务,就使客户程序中的类和子系统有过多的依赖关系。

比如,邮政系统邮寄包裹的子系统包含Check、Weight和Transport类。Check类的实例负责对包裹进行安全检查,Weight类的实例负责根据包裹的重量计算邮资,Transport类的实例负责为包裹负责运输工具。一个要邮寄包裹的用户若直接和负责邮寄包裹的类的子系统打交道,就必须先进行Check,然后在进行Weight,最后进行Transport,这就是的用户非常不方便。

外观模式简化用户和子系统进行交互的成熟模式,外观模式的关键是为子系统提供一个称作外观的类,该外观类的实例负责和子系统中类的实例进行打交道。当用户想要和子系统若干类的实例进行打交道时,可以代替的和子系统的外观类的实例打交道。

比如,对于前面叙述的邮寄包裹的子系统,可以为其提供一个称作ServerForClient的外观类,当用户想要邮寄包裹时,可以直接和ServerForClient的实例打交道,用户不必了解邮寄包裹的子系统中类的细节。 

包含角色:

   1、子系统(Subsystem):   子系统时若干个类的集合,这些类的实例协同合作为用户提供所需要的功能,子系统中任何类都不包含外观类的实例引用。

    2、外观(Facade):    外观是一个类,该类包含子系统中全部或者部分类的实例引用,当用户想要和子系统中的若干个类的实例打交道时,可以代替的和子系统的外观类的实例打交道。

优点:

   1、使客户和子系统中的类无耦合,并且子系统使用起来更加方便。

   2、外观只是提供一个更加简洁的界面,并不影响用户直接使用子系统中的类。

   3、子系统中任何类对其方法的内容进行修改,并不影响外观类的代码。

适用情景:

   1、对于一个复杂的子系统,需要为用户提供一个简单的交互操作。

   2、不希望客户代码和子系统中的类有耦合,以便提高子系统的独立性和可移植性。

   3、当整个系统需要构建一个层次结构的子系统,不希望这些子系统相互直接的交互。

简单例子:报社的广告有三个类CheckWord,Charge和TypeSeting类,各个类的职责如下:

   1、CheckWord的实例负责检查广告内容包含字符的个数;

   2、Charge类的实例负责计算费用;

   3、TypeString类的实例负责排版

 现在使用外观模式简化用户和上述子系统所进行的交互。比如一个用户想要在报社上登广告,那么用户只需要将广告的内容交给子系统的外观实例即可,外观的实例将负责和子系统中的类的实例进行交互完成用户所指派的任务。

/*** 子系统之Charge*/
public class Charge {public final int basicCharge = 12;CheckWord checkWord;public Charge(CheckWord checkWord){this.checkWord = checkWord;}public void giveCharge(){int charge = checkWord.getAmount() * basicCharge;System.out.println("广告费用:"+charge+"元");}
}/***  子系统之CheckWord*/
public class CheckWord {public final int baseAmount = 85;int amount;String advertisement;public CheckWord(String advertisement){this.advertisement = advertisement;}public void setChargeAmount(){amount = advertisement.length() + baseAmount;  //计算出付费字符数目}public int getAmount(){return amount;}
}/*** 子系统之TypeString*/
public class TypeString {String advertisement;public TypeString(String advertisement){this.advertisement = advertisement;}public void typeString(){System.out.println("广告排版格式:");System.out.println("************");System.out.println(advertisement);System.out.println("************");}
}/*** 外观类* 该类的实例包含TypeString、Charge、CheckWord的类的实例的引用。*/
public class ClientServerFacade {private CheckWord checkWord;private Charge charge;private TypeString typeString;String advertisement;public ClientServerFacade(String advertisement){this.advertisement = advertisement;checkWord = new CheckWord(advertisement);charge = new Charge(checkWord);typeString = new TypeString(advertisement);}public void doAdvertisement(){checkWord.setChargeAmount();charge.giveCharge();typeString.typeString();}
}/*** 启动器类*/
public class Application {public static void main(String[] args) {ClientServerFacade facade;String clientAdvertisement = "华硕A501L电脑,价格4999,联系电话:95279527";facade = new ClientServerFacade(clientAdvertisement);facade.doAdvertisement();}
}

输出结果:

   

这篇关于JAVA设计模式之外观模式(六)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1125585

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)