设计模式(七)门面模式(Facade)-结构型

门面模式Facade

门面模式:统之间的接口、框架之间的衔接

(1)使用接口的形式来开发,不需要知道接口中内部方法的实现;

(2)门面模式就是为子系统对外提供的一组接口提供一个统一的界面,使得其他系统对该系统的访问都通过这个统一的界面来完成。

(3)当一个负载的系统需要对外提供接口时,就需要将对提供的接口统一封装在外观类里,供外系统使用。

门面模式原理图

门面模式原理图

不用门面设计模式的情况

Holiday.java

public class Holiday {
	public double getHoliday(String empno) {
		return 2;
	}
}

Salary.java

public class Salary {
	public double getSalary(String empno){
		return 2000;
	}
}

Tax.java

public class Tax {
	public double getTax(String empno) {
		return 0;
	}
}

客户端Client.java

public class Client {
	public static void main(String[] args) {
		Salary salary = new Salary();
		Holiday holiday = new Holiday();
		Tax tax = new Tax();
		double money = salary.getSalary("100222") * holiday.getHoliday("100222")/30 - tax.getTax("100222");
		System.out.println(money);
	}
}

客户端会和几个类的联系程度较大;为使客户端程序尽量的减少,我们把计算薪水的代码块抽取到一个类里:

SalaryComputer.java

public class SalaryCoumputer {
	public double doSalary() {
		Salary salary = new Salary();
		Holiday holiday = new Holiday();
		Tax tax = new Tax();
		double money = salary.getSalary("100222") * holiday.getHoliday("100222")/30 - tax.getTax("100222");

		return money;
	}
}

客户端程序变为:

public class Client {
	public static void main(String[] args) {
		SalaryCoumputer salaryCoumputer = new SalaryCoumputer();
		System.out.println(salaryCoumputer.doSalary());
	}
}

如果有多个计算薪水,就不适合了,所以可以再把计算薪水的类换成一个接口

Computer.java

public interface Computer {
	public double doSalary(String empno);
}

SalaryComputer.java

public class SalaryCoumputer implements Computer{
	public double doSalary(String empno) {
		Salary salary = new Salary();
		Holiday holiday = new Holiday();
		Tax tax = new Tax();
		double money = salary.getSalary("100222") * holiday.getHoliday("100222")/30 - tax.getTax("100222");

		return money;
	}
}

一个专门读取properties属性文件的类

public class PropertiesUtil {
	static Properties p = new Properties();

	public static Object getInstance() {
		InputStream in = null;
		Object obj = null;
		try {
			in = PropertiesUtil.class.getClassLoader().getResourceAsStream("class.properties");
			p.load(in);
		} catch (IOException e) {
			e.printStackTrace();
		} finally{
			try {
				in.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		try {
			obj = (Object) Class.forName((String) PropertiesUtil.getValue("class")).newInstance();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return obj;
	}

	public static Object getValue(String key) {
		return p.get(key);
	}
}

Client.java

public class Client {
	public static void main(String[] args) {
		Computer computer = (Computer)PropertiesUtil.getInstance();
		System.out.println(computer.doSalary("100222"));
	}
}

应用如:JDBC的封装springJDBC的封装。

使用环境和优点 

《设计模式》给出了门面模式的使用环境

(1)当你要为一个复杂子系统提供一个简单接口时。在上面已经描述了原因。

(2) 客户程序与抽象类的实现部分之间存在着很大的依赖性。引入 facade 将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性(上面也提到了)。

(3)当你需要构建一个层次结构的子系统时,使用 facade 模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,你可以让它们仅通过 facade 进行通讯,从而简化了它们之间的依赖关系。

优点: 

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

(2)它实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。松耦合关系使得子系统的组件变化不会影响到它的客户。 Facade 模式有助于建立层次结构系统,也有助于对对象之间的依赖关系分层。 Facade 模式可以消除复杂的循环依赖关系。这一点在客户程序与子系统是分别实现的时候尤为重要。在大型软件系统中降低编译依赖性至关重要。在子系统类改变时,希望尽量减少重编译工作以节省时间。用
Facade 可以降低编译依赖性,限制重要系统中较小的变化所需的重编译工作。 Facade 模式同样也有利于简化系统在不同平台之间的移植过程,因为编译一个子系统一般不需要编译所有其他的子系统。

(3) 如果应用需要,它并不限制它们使用子系统类。因此你可以让客户程序在系统易用性和通用性之间加以选择。

时间: 2024-12-09 02:43:39

设计模式(七)门面模式(Facade)-结构型的相关文章

设计模式-11 外观模式(结构型模式)

一  外观模式 外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性. 主要解决:降低访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口. 关键代码:在客户端和复杂系统之间再加一层,这一次将调用顺序.依赖关系等处理好. 使用场景: JAVA 的三层开发模式 1.为复杂的模块或子系统提供外界访问的模块. 2.子系统相对独立. 3.预防低水平人员带来的风险. 类图

设计模式之门面模式---Facade Pattern

模式的定义 门面模式(Facade Pattern)也叫做外观模式,定义如下: Provide a unified interface to a set of interfaces in a subsystem. Facade defines a highet-level interface that makes the subsystem easier to use. 要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行.门面模式提供一个高层次的接口,使得子系统更易于使用. 类型 结构

Java常用的设计模式12:常用设计模式之外观模式(结构型模式)

1. Java之外观模式(Facade Pattern) (1)概述:       现代的软件系统都是比较复杂的,设计师处理复杂系统的一个常见方法便是将其"分而治之",把一个系统划分为几个较小的子系统.如果把医院作为一个子系统,按照部门职能,这个系统可以划分为挂号.门诊.划价.化验.收费.取药等.看病的病人要与这些部门打交道,就如同一个子系统的客户端与一个子系统的各个类打交道一样,不是一件容易的事情. 外观模式 (Facade):为子系统中的一组接口提供一个一致的界面,此模式定义了一个

23种设计模式-----创建型模式、结构型模式

一.创建型模式(都是用来帮助创建对象的) 1.单例模式 作用:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点 应用:Windows的任务管理器.回收站:项目中读取配置文件的类:网站的计数器:应用程序的日志应用:数据库连接池:操作系统的文件系统:Application:Spring中的bean:Servlet:spring MVC框架/struts1框架中的控制器对象 选用:占用资源小.不需要延时加载--------枚举-->饿汉           占用资源大 .需要延时    --

设计模式-12 享元模式(结构型模式)

一 享元模式 享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用. 主要解决:在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建. 关键代码:存储相似的对象 使用场景: 1.系统有大量相似对象. 2.需要缓冲池的场景. 类图 : 二 实现代码 Java里面的JDBC连接池,适用于作共享的一些个对象,他们有一些共有的属性,就拿数据库连接 池来说,url.driv

设计模式学习之外观模式(Facade,结构型模式)(8)

1.什么是外观模式为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用 2.为什么要使用外观模式在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,从而导致客户程序随着子系统的变化而变化,那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依赖解耦? 现在来考虑这样一个抵押系统,当有一个客户来时,有如下几件事情需要确认:到银行子系统查询他是否有足够多的存款,到信用子系统查询他是否有良好的信

23种设计模式介绍(二)---- 结构型模式

由于设计模式篇幅比较大,如果在一篇文章讲完所有的设计模式的话不利于阅读.于是我把它分为三篇文章 23种设计模式介绍(一)---- 创建型模式 23种设计模式介绍(二)---- 结构型模式 23种设计模式介绍(三)---- 行为型模式 设计模式都是比较抽象的概念,所以大家一定要确保看懂类图而后再自己写代码加强记忆. 概述 结构型模式共七种: 适配器模式(Adapter) 外观模式(Facade) 桥接模式(Bridge) 装饰器模式(Decorator) 代理模式(Proxy) 享元模式(Flyw

说说设计模式~门面模式(Facade)

返回目录 门面模式(Facade)属于结构型模式的一种,它符合面向对象的封装原则,但又不符合开闭原则,呵呵,今天我们主要说它的优点,不谈缺点. 定义 门面模式,是指提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口.使用子系统更容易使用. 技巧 我们在设计子类时,由于外部通过门面去访问它的功能,所以一般子类都会被声明为internal. 何时能用到它? 1.客户只需要使用某个复杂系统的子集,或者需要以一种特殊的方式与系统交互时,使用门面模式. 2.当

设计模式(八) : 结构型模式--装饰模式

装饰模式的目的是为了给一个对象动态的增加一些功能.装饰对象和被装饰的对象实现同一个接口,装饰对象持有被装饰对象的实例. 类图: 示意性代码: package com.javadesignpattern.Decorator; public interface Component { void sampleOperation(); } package com.javadesignpattern.Decorator; public class ConcreteComponent implements

设计模式08: Composite 组合模式(结构型模式)

Composite 组合模式(结构型模式) 对象容器的问题在面向对象系统中,我们常会遇到一类具有“容器”特征的对象——即他们在充当对象的同时,又是其他对象的容器. public interface IBox { void Process(); } public class SingleBox:IBox { public void Process(){...} } public class ContainerBox:IBox { public void Process(){...} public