• 设计模式(三)—— 外观模式


    一、定义

    门面模式是一种封装性质的模式。提供了一个统一的接口,用来反问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。

    二、适用的场景

    需要对一系列接口进行封装

    三、模式中的角色

    门面角色(Facade):调用子系统所有功能和责任
    子系统角色(SubSystem):一个或多个接口

    示意图

    四、应用场景举例

    案例一

    假设我们现实生活中的一个场景,我们通常在网购之后需要去取快递。

    这个过程又分为下面4个阶段:

    1. 收到取快递的通知 ,里面的信息有圆通快递,取货号12
    2. 走到取快递的店面
    3. 报出取货号
    4. 签字,拿到快递
    

    我们要取快递就要知道这几个步骤,当我们取了几次快递后,可能就轻车熟路了,一句“老铁,帮我取个快递”,你就能轻松完成取快递的几个步骤,而不是一步一步地照着说明书来。简而言之,就是将步骤封装成一个取快递的指令。

    改造前代码样例

    Express接口

    public interface IExpress {
    
    	public void haveMessage(String message);
    	
    	public void moveShop();
    	
    	public void sayNumber(int num);
    	
    	public void signName(String name);
    	
    }
    

    Express类

    public class Express implements IExpress{
    
    	@Override
    	public void haveMessage(String message) {
    		System.out.println("收到快递短信:"+message);
    	}
    
    	@Override
    	public void moveShop() {
    		System.out.println("走到快递店");
    	}
    
    	@Override
    	public void sayNumber(int num) {
    		System.out.println("报出号码:"+num);
    	}
    
    	@Override
    	public void signName(String name) {
    		System.out.println("收件人签字:"+name+",拿到快递");
    	}
    	
    
    }
    

    场景类

    public class Client {
    
    		public static void main(String[] args) {
    			String message ="圆通快递,取货号12";
    			int num = 12;
    			String name = "bigboss";
    			IExpress express  = new Express();
    			express.haveMessage(message);
    			express.moveShop();
    			express.sayNumber(num);
    			express.signName(name);
    		}
    }
    

    改造后代码样例

    对步骤进行封装

    门面模式类

    public class Facade {
    
    	private IExpress express;
    	
    	public Facade(IExpress express){
    		this.express = express;
    	}
    	
    	public void getExpress(String message,int num,String name){
    		express.haveMessage(message);
    		express.moveShop();
    		express.sayNumber(num);
    		express.signName(name);
    	}
    	
    }
    

    场景类

    public class Client {
    
    		public static void main(String[] args) {
    			String message ="圆通快递,取货号12";
    			int num = 12;
    			String name = "bigboss";
    			IExpress express  = new Express();
    			Facade facade = new Facade(express);
    			facade.getExpress(message, num, name);
    		}
    
    		
    }
    
  • 相关阅读:
    docker-compose 命令详解
    Ubuntu 安装 rabbitmq
    scrapy.cmdline.execute
    queue.Queue()
    多线程通信
    多线程(thread+queue 售票)
    协程
    线程
    利用Nginx实现反向代理web服务器
    利用Nginx实现反向代理web服务器
  • 原文地址:https://www.cnblogs.com/fonxian/p/5446765.html
Copyright © 2020-2023  润新知