zoukankan      html  css  js  c++  java
  • Facade外观模式

            外观模式(Facade)是结构型设计模式,外观模式就是为一个子系统中的多个类提供统一接口的方法,把一个组件单元构建为一个子系统有助于减少软件的复杂性,而且可以使子系统与其他组件的通信关系更加间接、易控制,可以最大限度的降低组件间的耦合度。达到这一个目标的最好方法就是引进一个外观类,让它为子系统的通用功能提供一个简单一致的公共接口。

           在别处看到一个例子,就是组装电脑,需要一台电脑,你可以去电子城,选择主板、显示器、CPU、各种外设等组装一台电脑。当然,为了方便,也可以直接找一家装机公司,它们负责将各种电脑组件组装好。这就是外观模式的概念。外观模式就是将多个关系比较复杂的类放到一个外观类中统一处理,从而外部调用起来只要与外观打交道,而不必清楚内部各个类之间的调用关系,简化了客户端调用的复杂度。

          考虑一下在ATM取款的系统:

          系统接口:

    package facade;
    
    public interface GetMoney {
    
    	public void doThings();
    }
    
          子系统1:

    package facade;
    
    public class InsertCards implements GetMoney{
    
    	
    	public InsertCards()
    	{
    		
    	}
    	@Override
    	public void doThings() {
    		// TODO Auto-generated method stub
    		//Do something
    		System.out.println("插入银行卡...");
    	}
    
    }
    

         子系统2:

    package facade;
    
    public class PassWord implements GetMoney{
    
    
    	public PassWord()
    	{
    		
    	}
    	@Override
    	public void doThings() {
    		// TODO Auto-generated method stub
    		//Do something
    		System.out.println("输入密码...");
    	}
    
    }
    
          子系统3:

    package facade;
    
    public class GetCash implements GetMoney{
    	public GetCash()
    	{
    		
    	}
    	@Override
    	public void doThings() {
    		// TODO Auto-generated method stub
    		//Do something
    		System.out.println("取出现金...");
    	}
    }
    

    如果不使用facade模式,则客户端程序:

    package facade;
    
    public class Client_Without_Facade {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    
    		InsertCards insertcards = new InsertCards();
    		
    		insertcards.doThings();
    		
    		PassWord password = new PassWord();
    		
    		password.doThings();
    		
    		GetCash getcash = new GetCash();
    		
    		getcash.doThings();
    		
    		System.out.println("Succeed to get money!");
    		
    		
    	}
    
    }
    

           如果银行在某一天要增加ATM取款的安全,要增加ATM取款时候的步骤,增加步骤A,那么必须要修改客户端程序,这样代价就高了。如果使用Facade模式,则编写Facade类:

    package facade;
    
    public class Facade {
    	public Facade()
    	{
    		
    	}
    	public void doThings()
    	{
    		InsertCards insertcards = new InsertCards();
    		
    		insertcards.doThings();
    		
    		PassWord password = new PassWord();
    		
    		password.doThings();
    		
    		GetCash getcash = new GetCash();
    		
    		getcash.doThings();
    		
    		
    	}
    }
    

    客户端代码:

    package facade;
    
    public class Client {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    
    		Facade facade = new Facade();
    		
    		facade.doThings();
    		
    		System.out.println("Succeed to get money!");
    	}
    
    }
    

    这样如果要做出上述修改,则只需修改Facade类和增加子系统即可,不用修改Client程序。

    综上所述,Facade模式的优点:

    1.松散耦合。外观模式松散了客户端与子系统的耦合关系,让子系统内部的模块可以更容易扩展和维护。 

    2.简单易用。外观模式让子系统更易用,客户商无需要了解子系统的内部细节,更不需要与各子系统模块进行交互,只需要与外观对象进行交互就可以呢,由外观模式为客户端提供一站式服务。



  • 相关阅读:
    学完自动化测试,用小技能做了点兼职刷弹幕,小赚10W
    学会这个,助你升值加薪自动化框架之python+selenium+pytest
    我都30岁了,现在做软件测试还来得及吗
    如何从小白成长为技术大牛,阿里测试总监为你梳理成神之路【全套资源分享】
    Google公布编程语言排名,第一竟然是他?
    程序员改行率竟然高达40%,看完我沉默了
    程序员一定要远离这个万恶之源
    自动化测试框架很难吗?我不觉得,不信你看
    三年经验的程序员,为什么能力要强过80%的人
    实验十 团队作业6:团队项目用户验收&Beta冲刺
  • 原文地址:https://www.cnblogs.com/sunp823/p/5601417.html
Copyright © 2011-2022 走看看