23种设计模式(10)——门面模式

门面模式(Facade Pattern)又叫作外观模式,提供了一个统一的接口,用来访问子系统中的一群接口。其主要特征是定义了一个高层接口,让子系统更容易使用,属于结构型设计模式。

其实,在日常编码工作中,我们都在有意无意地大量使用门面模式。但凡只要高层模块需要调度多个子系统(2个以上类对象),我们都会自觉地创建一个新类封装这些子系统,提供精简的接口,让高层模块可以更加容易地间接调用这些子系统的功能。

来个简单的demo:

我u有以下三个service:

public class ServiceA { 
    public void doA(){ 
        System.out.println("do ServiceA"); 
    } 
} 
public class ServiceB { 
    public void doB(){ 
        System.out.println("do ServiceB"); 
    } 
} 
 
public class ServiceC { 
    public void doC(){ 
        System.out.println("do ServiceC"); 
    } 
} 

在没有引入门面模式的时候,我们是这么调用的:

public class Client { 
    public static void main(String[] args) { 
        ServiceA serviceA = new ServiceA(); 
        ServiceB serviceB = new ServiceB(); 
        ServiceC serviceC = new ServiceC(); 
 
        serviceA.doA(); 
        serviceB.doB(); 
        serviceC.doC(); 
    } 
} 

没啥毛病啊,结合到spingmvc开发,这些service交给spring管理,根本不用自己new了,直接注入到controller就可以,但是如果10个地方都用了这三个service呢?这10个controller里都注入一下?这时候考虑优化——我可以新建一个service,持有这个三个service不就ok了吗:

public class ServiceFacade { 
    //是不是很像我们controller里注入各种service? 
    private ServiceA serviceA = new ServiceA(); 
    private ServiceB serviceB = new ServiceB(); 
    private ServiceC serviceC = new ServiceC(); 
 
    public void doA() { 
        serviceA.doA(); 
    } 
 
    public void doB() { 
        serviceB.doB(); 
    } 
 
    public void doC() { 
        serviceC.doC(); 
    } 
} 

客户端就变成了

public class Client { 
    public static void main(String[] args) { 
        //轻轻松松的搞定,只需要创建门面这个对象即可 
        ServiceFacade serviceFacade= new ServiceFacade (); 
        serviceFacade.doA(); 
        serviceFacade.doB(); 
        serviceFacade.doC(); 
    } 
} 

门面模式中的角色

由上图可以看到,门面模式主要包含2个角色。

  • 外观角色(Facade):也叫作门面角色,是系统对外的统一接口。
  • 子系统角色(Service):可以同时有一个或多个Service。每个Service都不是一个单独的类,而是一个类的集合。Service们并不知道Facade的存在,对于Service们而言,Facade 只是另一个客户端而已(即Facade对ServiceA、ServiceB、ServiceC透明)。

门面模式的扩展

优点

● 减少系统的相互依赖   想想看,如果我们不使用门面模式,外界访问直接深入到子系统内部,相互之间是一种强耦合关系,你死我就死,你活我才能活,这样的强依赖是系统设计所不能接受的,门面模式的出现就很好地解决了该问题,所有的依赖都是对门面对象的依赖,与子系统无关。

● 提高了灵活性   依赖减少了,灵活性自然提高了。不管子系统内部如何变化,只要不影响到门面对象,任你自由活动。

● 提高安全性   想让你访问子系统的哪些业务就开通哪些逻辑,不在门面上开通的方法,你休想访问到 。

缺点

当增加子系统和扩展子系统行为时,可能容易带来未知风险。

不符合开闭原则。

某些情况下,可能违背单一职责原则。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
23种设计模式图形主要是用来表示不同的设计模式,每一种模式都有自己的特点和用途。下面我简单介绍一下每种模式的图形以及它们的区别: 1. 工厂方法模式(Factory Method Pattern):该模式的图形通常是一个工厂类,用于创建其他类的实例。 2. 抽象工厂模式(Abstract Factory Pattern):该模式的图形通常是一个抽象工厂类,用于创建具有相同主题的一系列对象。 3. 单例模式(Singleton Pattern):该模式的图形通常是一个单例类,表示只有一个实例存在。 4. 建造者模式(Builder Pattern):该模式的图形通常是一个建造者类,用于创建一个复杂对象。 5. 原型模式(Prototype Pattern):该模式的图形通常是一个原型类,用于创建其他类的副本。 6. 适配器模式(Adapter Pattern):该模式的图形通常是一个适配器类,用于将一个类的接口转换为另一个类的接口。 7. 桥接模式(Bridge Pattern):该模式的图形通常是一个抽象类和一个实现类,用于将抽象类和实现类分离开来。 8. 组合模式(Composite Pattern):该模式的图形通常是一个组合类和一个叶子类,用于将对象组合成树形结构。 9. 装饰器模式(Decorator Pattern):该模式的图形通常是一个装饰器类,用于给一个对象添加新的功能。 10. 外观模式(Facade Pattern):该模式的图形通常是一个门面类,用于隐藏系统的复杂性。 11. 享元模式(Flyweight Pattern):该模式的图形通常是一个享元工厂类和一个具体享元类,用于共享对象以减少内存占用。 12. 代理模式(Proxy Pattern):该模式的图形通常是一个代理类和一个实际类,用于控制对实际对象的访问。 13. 责任链模式(Chain of Responsibility Pattern):该模式的图形通常是一个处理请求的抽象类和一系列具体的处理类,用于将请求的发送者和接收者分离开来。 14. 命令模式(Command Pattern):该模式的图形通常是一个命令类和一个接收者类,用于将请求封装成对象。 15. 解释器模式(Interpreter Pattern):该模式的图形通常是一个解释器类和一个抽象语法树类,用于解释和执行特定的语言。 16. 迭代器模式(Iterator Pattern):该模式的图形通常是一个迭代器类和一个容器类,用于迭代处理容器中的元素。 17. 中介者模式(Mediator Pattern):该模式的图形通常是一个中介者类和一系列相关的对象,用于将对象之间的通信和协作进行解耦。 18. 备忘录模式(Memento Pattern):该模式的图形通常是一个备忘录类和一个发起人类,用于保存和恢复对象的状态。 19. 观察者模式(Observer Pattern):该模式的图形通常是一个主题类和一系列观察者类,用于在对象之间建立一对多的依赖关系。 20. 状态模式(State Pattern):该模式的图形通常是一个状态类和一个环境类,用于将对象的行为根据状态进行分离和管理。 21. 策略模式(Strategy Pattern):该模式的图形通常是一个策略接口和一系列具体的策略类,用于将算法的实现和使用分离开来。 22. 模板方法模式(Template Method Pattern):该模式的图形通常是一个抽象类和一系列具体的子类,用于定义一个算法的框架和一些步骤的实现方式。 23. 访问者模式(Visitor Pattern):该模式的图形通常是一个访问者类和一系列元素类,用于在不改变元素类的前提下,对其进行操作和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值