Facade模式

概述

在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,而导致客户程序随着子系统的变化而变化。那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依赖解耦?这就是要说的Facade 模式。


意图

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

示意图

门面模式没有一个一般化的类图描述,下面是一个示意性的对象图:

图1 Façade模式示意性对象图

生活中的例子

外观模式为子系统中的接口定义了一个统一的更高层次的界面,以便于使用。当消费者按照目录采购时,则体现了一个外观模式。消费者拨打一个号码与客服代表联系,客服代表则扮演了这个"外观",他包含了与订货部、收银部和送货部的接口。

图2使用电话订货例子的外观模式对象图

Facade模式解说

我们平时的开发中其实已经不知不觉的在用Façade模式,现在来考虑这样一个抵押系统,当有一个客户来时,有如下几件事情需要确认:到银行子系统查询他是否有足够多的存款,到信用子系统查询他是否有良好的信用,到贷款子系统查询他有无贷款劣迹。只有这三个子系统都通过时才可进行抵押。我们先不考虑Façade模式,那么客户程序就要直接访问这些子系统,分别进行判断。类结构图下:

图3

在这个程序中,我们首先要有一个顾客类,它是一个纯数据类,并无任何操作,示意代码:

public class Customer {
	private String _name;
	
	Customer(String name){
		this._name = name;
	}

	public String get_name() {
		return _name;
	}

	public void set_name(String _name) {
		this._name = _name;
	}

}

//银行子系统
public class Bank {
	public boolean HasSufficientSavings(Customer c, int amount) {
		return true;
	}
}

//信用子系统
public class Credit {
	public boolean HasGoodCredit(Customer c) {
		return true;
	}
}

//贷款子系统
public class Loan {
	public boolean HasNoBadLoans(Customer c) {
		return true;
	}
}

//依赖于子系统
public class Fail {
	private final static int _amount = 12000;

	public static void Main() {
		Bank bank = new Bank();
		Loan loan = new Loan();
		Credit credit = new Credit();

		Customer customer = new Customer("Ann McKinsey");

		boolean eligible = true;

		if (!bank.HasSufficientSavings(customer, _amount)) {
			eligible = false;
		} else if (!loan.HasNoBadLoans(customer)) {
			eligible = false;
		} else if (!credit.HasGoodCredit(customer)) {
			eligible = false;
		}

	}
}

可以看到,在不用Façade模式的情况下,客户程序与三个子系统都发生了耦合,这种耦合使得客户程序依赖于子系统,当子系统变化时,客户程序也将面临很多变化的挑战。一个合情合理的设计就是为这些子系统创建一个统一的接口,这个接口简化了客户程序的判断操作。看一下引入Façade模式后的类结构图:

图4

//外观类
public class Mortgage {
	private Bank bank = new Bank();
	private Loan loan = new Loan();
	private Credit credit = new Credit();

	public boolean IsEligible(Customer cust, int amount) {

		boolean eligible = true;

		if (!bank.HasSufficientSavings(cust, amount)) {
			eligible = false;
		} else if (!loan.HasNoBadLoans(cust)) {
			eligible = false;
		} else if (!credit.HasGoodCredit(cust)) {
			eligible = false;
		}

		return eligible;
	}
}

//客户程序类
public class MainApp {
	public static void Main() {
		// 外观
		Mortgage mortgage = new Mortgage();

		Customer customer = new Customer("Ann McKinsey");
		boolean eligable = mortgage.IsEligible(customer, 125000);
	}
}


可以看到引入Façade模式后,客户程序只与Mortgage发生依赖,也就是Mortgage屏蔽了子系统之间的复杂的操作,达到了解耦内部子系统与客户程序之间的依赖。

效果及实现要点

1.Facade模式对客户屏蔽了子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便。

2.Facade模式实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。松耦合关系使得子系统的组件变化不会影响到它的客户。

3.如果应用需要,它并不限制它们使用子系统类。因此你可以在系统易用性与通用性之间选择。

适用性

1.为一个复杂子系统提供一个简单接口。

2.提高子系统的独立性。

3.在层次化结构中,可以使用Facade模式定义系统中每一层的入口。

总结

Façade模式注重的是简化接口,它更多的时候是从架构的层次去看整个系统,而并非单个类的层次。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Session Facade是一种设计模式,用于在应用程序提供统一的接口,使客户端可以与底层系统进行交互。该模式将底层系统封装在一个高级接口,使客户端可以更方便地访问底层系统,同时也可以保护底层系统的实现细节。 在会话Bean注入实体管理器是一种常见的使用方式。实体管理器是JPA规范的一个组件,用于管理实体对象的持久化状态。在会话Bean注入实体管理器可以使开发人员更方便地对实体对象进行操作,比如查询、插入、更新等。 使用Session Facade模式和注入实体管理器有以下特点: 1. 统一接口:Session Facade模式提供了一个统一的接口,使客户端可以更方便地访问底层系统的功能,而不需要了解底层系统的实现细节。 2. 简化操作:通过注入实体管理器,开发人员可以更方便地对实体对象进行操作,比如查询、插入、更新等。 3. 提高性能:由于会话Bean通常是有状态的,因此开发人员可以利用这一特性来缓存实体对象,从而提高应用程序的性能。 4. 提高可维护性:Session Facade模式可以将底层系统的实现细节隐藏起来,从而提高应用程序的可维护性。开发人员可以更方便地进行重构和修改,而不会影响客户端的使用。 ### 回答2: Session Facade模式是一种设计模式,用于在企业应用程序提供统一的接口,以封装底层系统的复杂性。它的核心思想是通过一个会话Bean来集成和暴露系统的多个底层服务,实现对外提供统一的接口。 在会话Bean注入的实体管理器是用于处理与数据库交互的对象。它有以下使用特点: 1. 数据库事务管理:实体管理器可以管理数据库事务。在会话Bean,可以使用注解或编程方式来指定事务的边界,并通过实体管理器来控制事务的启动、提交和回滚。 2. 实体对象管理:实体管理器可以跟踪和管理实体对象的生命周期。通过实体管理器,可以进行实体对象的创建、读取、更新和删除操作,以及查询操作。 3. 缓存管理:实体管理器可以使用缓存来提高数据库访问性能。它可以在查询时自动使用缓存,并在更新操作后更新缓存,以减少对数据库的访问次数。 4. 乐观锁控制:实体管理器可以实现乐观锁控制,用于解决并发访问冲突的问题。它可以通过版本字段或时间戳字段来检测并发更新冲突,并提供相关的异常处理机制。 5. 查询语言支持:实体管理器可以支持各种查询语言,如JPQL、SQL和Criteria查询。它可以使用这些查询语言进行复杂的查询操作,并提供结果集的处理和返回。 总之,通过在会话Bean注入实体管理器,可以方便地进行对数据库的操作和管理,同时提供了事务管理、实体对象管理、缓存管理、乐观锁控制和查询语言支持等功能。这样可以使得业务逻辑代码更简洁、清晰,并提高系统的可维护性和可扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值