外观(Facade)模式

外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。

何时使用: 1、客户端不需要知道系统内部的复杂联系,整个系统只需提供一个"接待员"即可。 2、定义系统的入口。
如何解决:客户端不与系统耦合,外观类与系统耦合。
关键代码:在客户端和复杂系统之间再加一层,这一层将调用顺序、依赖关系等处理好。
应用实例: 1、去医院看病,可能要去挂号、门诊、划价、取药,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便。 2、JAVA 的三层开发模式。
优点: 1、减少系统相互依赖。 2、提高灵活性。 3、提高了安全性。
缺点:不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。
使用场景: 1、为复杂的模块或子系统提供外界访问的模块。 2、子系统相对独立。 3、预防低水平人员带来的风险。

注意事项:在层次化结构中,可以使用外观模式定义系统中每一层的入口。


外观(Facade)模式_第1张图片

1.创建不同的worker代表不同的子类系统

package com.zqr.design.facadePattern;

public class Worker_01 {
	public void work() {
		System.out.println("第一个工人,工作.....");
	}
	public void rest() {
		System.out.println("第一个工人,休息.....");
	}
}
package com.zqr.design.facadePattern;
public class Worker_02 {
	public void work() {
		System.out.println("第二个工人,工作.....");
	}
	public void rest() {
		System.out.println("第二个工人,休息.....");
	}
}

package com.zqr.design.facadePattern;
public class Worker_03 {
	public void work() {
		System.out.println("第三个工人,工作.....");
	}
	public void rest() {
		System.out.println("第三个工人,休息.....");
	}
}

2.创建包工头Contractor代表外观类,为客户端提供可见接口

package com.zqr.design.facadePattern;
/**
 * 	外观类:统一封装子类方法/接口,为客户端提供可调用接口.具体实现对客户端不可见
    * @ClassName: Contractor  
 */
public class Contractor {
	private Worker_01 wk1;
	private Worker_02 wk2;
	private Worker_03 wk3;
	public Contractor() {
		if (null == wk1) {
			wk1 = new Worker_01();
		}
		if (null == wk2) {
			wk2 = new Worker_02();
		}
		if (null == wk3) {
			wk3 = new Worker_03();
		}
	}
	public void work() {
		wk1.work();
		wk2.work();
		wk3.work();
	}
	public void rest() {
		wk1.rest();
		wk2.rest();
		wk3.rest();
	}
}

3.Test

外观(Facade)模式_第2张图片外观(Facade)模式_第3张图片

你可能感兴趣的:(设计模式,玩转设计模式)