设计模式之门面模式

选择23种设计模式之一:门面模式


概述

               门面模式是对象的结构模式,外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。


解决的问题

        1.当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。

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

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

模式中的角色

  

1)门面角色( facade ):这是门面模式的核心。它被客户角色调用,因此它熟悉子系统的功能。它内部根据客户角色已有的需求预定了几种功能组合。


2)子系统角色:实现了子系统的功能。对它而言, façade 角色就和客户角色一样是未知的,它没有任何 façade 角色的信息和链接。


3)客户角色:调用 façade 角色来完成要得到的功能


观察者模式的类图


java案例剖析

以医院案例进行分析,一个医院下面有好多个部门,每个部门都是一个完整的体系,都有一套各自的运行机制,例如门诊是查看你的具体病因的;挂号部,是你进行看病时候先预约的部门。病人人去医院看病,先得挂号,然后在去门诊,在去划价,然后在去取药(完整的流程执行这些过程),其中门诊,挂号,划价,取药就是各个子系统,用户在各个子系统中进行来回使用,相当的不方便,病人最终目的就是给一些取药的信息,然后拿到药就OK,不需要去各个子系统中进行调用。于是引用门面模式。


子系统角色:

package com.lgy.design;

public enum Hospital {
	Outpatient {

		@Override
		public void doAction() {
			System.out.println("门诊");
		}
		
	},Register {

		@Override
		public void doAction() {
			System.out.println("挂号");
		}
		
	},Price {

		@Override
		public void doAction() {
			System.out.println("取价");
		}
		
	},Take {

		@Override
		public void doAction() {
			System.out.println("取药");
		}
		
	};
	
	
	
	 public abstract void doAction();
}


门面角色 门面模式的核心类,一般是单例模式:

package com.lgy.design;


public class HospitalFacade {
	private HospitalFacade() {
	}

	private static class SingletonHolder {
		private static final HospitalFacade INSTANCE = new HospitalFacade();
	}

	public static HospitalFacade getInstance() {
		return SingletonHolder.INSTANCE;
	}
	
	public void TakeDrug() {
		Hospital.Outpatient.doAction();
		
		Hospital.Register.doAction();
		
		Hospital.Price.doAction();
		
		Hospital.Take.doAction();
	}
}


客户角色:

package com.lgy.design;

public class PatientA {
	public static void main(String[] args) {
		HospitalFacade hospitalFacade = HospitalFacade.getInstance();
		
		hospitalFacade.TakeDrug();
	}
}



门面模式好处总结

                   1.松耦合度

                               门面模式松散了客户端与子系统的耦合关系,让子系统内部的模块能更容易扩展和维护。

                   2.简单运用

                               门面模式让子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要跟众多子系统内部的模块进行交互,只需要跟门面类交互就可以了。

                   3.更好的划分访问层次

                               通过合理使用Facade,可以帮助我们更好地划分访问的层次。有些方法是对系统外的,有些方法是系统内部使用的。把需要暴露给外部的功能集中到门面中,这样既方便客户端使用,也很好地隐藏了内部的细节。

    


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值