门面/外观模式

一、门面模式

1、定义

门面模式(Facade Pattern)又称作外观模式,是指提供一个统一的接口,用来访问子系统中的一群接口,属于结构型设计模式。

门面模式的主要特征是定义了一个高层接口,让子系统更容易使用。

2、结构

(1)模式的结构

主要角色如下:

  • 外观角色(Facade):也叫作门面角色,是系统对外的统一接口。
  • 子系统角色(SubSystem):可以同时有一个或者多个 SubSystem。每一个 SubSystem都不是一个单独的类,而是一个类的集合。

注意:子系统类中没有 Facade任何信息,即没有 Facade对象的引用。对于 SubSystem而言,Facade只是另一个客户端,处理 Facade指派的任务。

3、优缺点

优点:

  • 简化了调用过程,不用深入了解子系统。
  • 减少系统依赖,松耦合。
  • 更好的划分访问层次,提高安全性。
  • 遵循迪米特法则。

缺点:

  • 当增加子系统和画展子系统行为时,可能容易带来未知危险。
  • 不符合开闭原则。
  • 某些情况下,可能违背了单一职责原则。

4、使用场景

  • 为一个复杂的模块或者子系统提供一个简单的供外界访问的接口。
  • 希望提高子系统的相对独立性时,可以使用它。

5、在框架源码中使用

  • Spring源码中 JDBC模块下的 JdbcUtils类,它封装了与 JDBC相关的所有操作。
  • Mybatis源码中 Congiguration类,对 JDBC中关键组件的封装。

二、模式的通用实现

代码如下:

public class FacadePattern {
	public static void main(String[] args) {
		ServiceFacade serviceFacade = new ServiceFacade();
		serviceFacade.doCommon();
	}
}

// 子系统角色
class SubSystemA {
	public void doA() {
		System.out.println("doing A");
	}
}

class SubSystemB {
	public void doB() {
		System.out.println("doing B");
	}
}

// 外观角色
class ServiceFacade {
	private SubSystemA subSystemA;
	private SubSystemB subSystemB;

	public ServiceFacade() {
		this.subSystemA = new SubSystemA();
		this.subSystemB = new SubSystemB();
	}

	// 对外接口
	public void doCommon() {
		subSystemA.doA();
		subSystemB.doB();
	}
}

三、模式的应用实例

以客户通过购买基金(门面)从而获得收益为例。基金经理人操作股票(子系统)交易。

(1)股票(子系统)

public class Stock1 {
    private String name = "股票1";

    public void buy(){
        System.out.println("买进" + name);
    }

    public void sell(){
        System.out.println("卖出" + name);
    }
}

public class Stock2 {
    private String name = "股票2";

    public void buy(){
        System.out.println("买进" + name);
    }

    public void sell(){
        System.out.println("卖出" + name);
    }
}

(2)基金(门面)

public class FundFacade {
    private String name = "基金A";

    private Stock1 stock1;
    private Stock2 stock2;

    public FundFacade() {
        this.stock1 = new Stock1();
        this.stock2 = new Stock2();
    }

    public void buyFund(){
        System.out.println("买进" + name + ", 基金经理买进的股票如下:");
        stock1.buy();
        stock2.buy();
    }

    public void sellFund(){
        System.out.println("卖出" + name+ ", 基金经理卖出的股票如下:");
        stock1.sell();
        stock2.sell();
        System.out.println("收益1W+");
    }
}

(3)测试:小白购买该基金

	public static void main(String[] args) {
		FundFacade fundFacade = new FundFacade();
		fundFacade.buyFund();
		System.out.println("----第N天之后----");
		fundFacade.sellFund();
	}

在这里插入图片描述

– 求知若饥,虚心若愚。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值