Gof23种设计模式(10)——外观模式(Facade)

2020年8月14日10:15:46 评论 51

1 基础知识

1.1 标准定义

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

1.2 分析和说明

外观(Facade)模式也叫外观模式,属于结构型设计模式。外部与一个子系统的通信必须通过一个统一的外观对象进行。外观模式提供一个高层次的接口,使得子系统更易于使用。每一个子系统只有一个外观类,而且此外观类只有一个实例,也就是说它是一个单例模式。但整个系统可以有多个外观类。

Facade结构如图1所示。其角色包括外观(Facade)角色和子系统(Subsystem)角色。

Gof23种设计模式(10)——外观模式(Facade)

图1 外观模式结构

 外观(Facade)角色:客户端可以调用这个角色的方法。此角色知晓相关的(一个或者多个)子系统的功能和责任。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去。

 子系统(Subsystem)角色:可以同时有一个或者多个子系统。每一个子系统都不是一个单独的类,而是一个类的集合。每一个子系统都可以被客户端直接调用,或者被外观角色调用。子系统并不知道外观的存在,对于子系统而言,外观仅仅是另外一个客户端而已。

2 应用场景举例

比如公司总有前台,来访的人员主要是做这几类工作,一类是过来工作,一类是访客,一类是邮差送东西,还有就是领导视察等。但是都是通过前台来实现。应用场景用例见图2.

Gof23种设计模式(10)——外观模式(Facade)

图2 外观模式用例图

在这里可以把Facade类理解为外观(Facade)角色。DoWork类,Inspection类,Post类和Visit类是子系统(Subsystem)角色。其结构类图如图3所示。Facade类聚合DoWork类,Inspection类,Post类和Visit类等四个类。

Gof23种设计模式(10)——外观模式(Facade)

图3 外观模式类图

外观模式实现的顺序图见图4。实现顺序描述:
①创建一个外观facade对象;
②分别创建dowork对象、post对象、visit对象、inspection对象;
③-④调用facade对象的“dowork”工作,dowork对象调用dowork方法;
⑤-⑥调用facade对象的“post”工作,post对象调用dowork方法;
⑦-⑧调用facade对象的“visit”工作,visi对象调用dowork方法;
⑨-⑩调用facade对象的“inspection”工作,inspection对象调用dowork方法。

Gof23种设计模式(10)——外观模式(Facade)

图4 外观模式实现顺序图

在外观模式的应用中,所有的操作都要经过外观来协调或验证。外观这个高层接口使得各个子系统更容易使用和维护,降低耦合便于扩展。可以解耦关联、增加各部分的独立性.各部分的修改、扩展不影响其他部分,满足组件设计对外提供一致性的要求。

3.Java的实现程序代码

Java程序实现主要包括Facade类文件,DoWork类文件,Inspection类文件,Post类文件和Visit类文件等5个文件。其关系如图3所示。下面分别列出这5个文件的程序代码,最后列出测试代码并显示输出结果。

Facade类程序代码清单01所示。

程序代码清单01

public class Facade {

	private Visit visit = new Visit();
	private Post post = new Post();
	private Inspection inspection = new Inspection();
	private DoWork doWork = new DoWork();

	public void Operate(String operation) {
		
		if (operation.toLowerCase().equals("visit")) {
			visit.operate();
		} else if (operation.equals("post")) {
			post.operate();
		} else if (operation.equals("inspection")) {
			inspection.operate();
		} else if (operation.equals("doWork")) {
			doWork.operate();
		} else {
			System.out.println("没有对应事项,不能工作。");
		}
	}
}

DoWork类,Inspection类,Post类和Visit类程序代码清单02所示。

程序代码清单02

public class DoWork {
	public void operate() {
		System.out.println("员工:打卡考勤。");
	}
}

public class Inspection {
	public void operate() {
		System.out.println("领导视察:端茶倒水。");
	}
}

public class Post {
	public void operate() {
		System.out.println("邮递员:登记收发物品。");
	}
}

public class Visit {
	public void operate() {
		System.out.println("访客:登记身份证。");
	}
}

外观模式测试程序的代码清单03如下:

程序代码清单03

public class Client {

	public static void main(String[] args) {

		Facade facade = new Facade();

		// 向前台要求访客
		facade.Operate("visit");

		// 向前台提交邮品
		facade.Operate("post");

		// 领导过来视察
		facade.Operate("inspection");

		// 员工上班
		facade.Operate("doWork");

		// study是没有对应的工作接口
		facade.Operate("study");
	}
}

外观模式测试类输出结果如下所示:

访客:登记身份证。
邮递员:登记收发物品。
领导视察:端茶倒水。
员工:打卡考勤。
没有对应事项,不能工作。

4 扩展和说明

Session Facade模式是15种J2EE设计模式中的一种设计模式。基于EJB的应用基本上都是通过调用Facade Session Bean来实现的。使用Facade Session Bean,该Session Bean从更大粒度的业务角度来封装复杂的业务流程,为客户端提供一个更简单的访问界面。Session Facade模式结构图。

Gof23种设计模式(10)——外观模式(Facade)

图5 Session Facade模式结构图

Client可以是一般的Java Object,或者是Business Delegate或其它的SessionBean等。SessionFacade是一个SessionBean,它负责管理多个BusinessObject,为客户端提供更高级别的访问界面。Client通过SessionFacade完成业务逻辑处理。Business Object业务逻辑处理组件。这样的好处在于:①担当业务层的控制器角色。②为客户端提供统一简单的接口界面;③减少耦合性,提高可管理能力;④减少网络调用,提供性能;⑤安全管理,事务管理等的集中控制;⑥暴露更少的接口给客户端。

(转载自微信公众号:架构设计模式)


参考链接

7种结构型模式

Gof23种设计模式(6)——适配器模式(Adapter)
Gof23种设计模式(7)——桥接模式(Bridge)
Gof23种设计模式(8)——组合模式(Composite)
Gof23种设计模式(9)——装饰器模式(Decorator)
Gof23种设计模式(10)——外观模式(Facade)
Gof23种设计模式(11)——享元模式(Flyweight)
Gof23种设计模式(12)——代理模式(Proxy)
Gof23种设计模式 —— 结构型模式总结和比较

回到总目录Gof23种设计模式(全解析)

(转载自微信公众号:架构设计模式)

素课网
  • 本文由 发表于 2020年8月14日10:15:46
  • 转载请注明:https://www.suketech.com/9273.html
设计模式:面向对象设计的六大原则 - 总结 设计模式

设计模式:面向对象设计的六大原则 – 总结

开闭原则是面向对象设计中最基础的设计原则,它指导我们如何建立稳定灵活的系统。开闭原则可能是设计模式六项原则中定义最模糊的一个了,它只告诉我们对扩展开放,对修改关闭,可是到底如何才能做到对扩展开放,对修...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: