设计模式之外观模式

一、什么是外观模式

你家里有各种电器的开关,照明灯开关,家电开关什么的,你平常用用哪个电器就去打开哪个电器的开关。但是你家里也有一个电源总开关,可以控制这些家电的开关使用,这个总共开关便可以理解为这些家电系统的外观模式设计。

二、定义

外观模式是一种使用频率非常高的结构型设计模式,它通过引入一个外观角色来简化客户端与子系统之间的交互,为复杂的子系统调用提供一个统一的入口,降低子系统与客户端的耦合度,且客户端调用非常方便。

外观模式的目的不是给予子系统添加新的功能接口,而是为了让外部减少与子系统内多个模块的交互,松散耦合,从而让外部能够更简单地使用子系统。

外观模式的本质是:封装交互,简化调用。

三、包含角色

Facade(外观角色):为多个子系统对外提供一个共同的接口。

SubSystem(子系统角色):在软件系统中可以有一个或者多个子系统角色,每一个子系统可以不是一个单独的类,而是一个类的集合,它实现子系统的功能;端而已。

四、使用场景

  • 为一个复杂的模块或子系统提供一个外界访问的接口
  • 子系统相对独立,外界对子系统的访问只要黑箱操作即可

五、优缺点

1、优点

  • 减少了系统的相互依赖
  • 提高了灵活性。不管系统内部如何变化,只要不影响到外观对象,任你自由活动
  • 提高了安全性。想让你访问子系统的哪些业务就开通哪些逻辑,不在外观上开通的方法,你就访问不到

2、缺点

  • 不符合开闭原则,修改很麻烦

六、代码结构

package facade;
public class FacadePattern{
    public static void main(String[] args)
    {
        Facade f=new Facade();
        f.method();
    }
}

//外观角色
class Facade{

    private SubSystem01 obj1=new SubSystem01();
    private SubSystem02 obj2=new SubSystem02();
    
    //提供对外统一的调用接口
    public void method() {
        obj1.method1();
        obj2.method2();
    }
}

//子系统角色
class SubSystem01
{
    public  void method1() {
        //do something
    }   
}
//子系统角色
class SubSystem02{
    public  void method2(){
        //do something
    }   
}

七、代码案例

外观角色

package Facade;

/**
 * @Package: Facade
 * @ClassName: Switch
 * @Author: tanp
 * @Description: 外观角色,总开关
 * @Date: 2020/11/6 11:41
 */
public class Switch {

    private TV tv = new TV();
    private Light light = new Light();

    public void open(){
        tv.openTV();
        light.openLight();
    }

    public void close(){
        tv.closeTV();
        light.closeLight();
    }
}

子系统角色

package Facade;

/**
 * @Package: Facade
 * @ClassName: Light
 * @Author: tanp
 * @Description: 子系统角色,照明灯的开关
 * @Date: 2020/11/6 11:38
 */
public class Light {

    public void openLight(){
        System.out.println("打开了照明灯");
    }

    public void closeLight(){
        System.out.println("关闭了照明灯");
    }
}

package Facade;

/**
 * @Package: Facade
 * @ClassName: TV
 * @Author: tanp
 * @Description: 子系统角色 电视机的开关
 * @Date: 2020/11/6 11:39
 */
public class TV {

    public void openTV(){
        System.out.println("打开了电视机");
    }

    public void closeTV(){
        System.out.println("关闭了电视机");
    }
}

main

package Facade;

/**
 * @Package: Facade
 * @ClassName: DemoClient
 * @Author: tanp
 * @Description: ${description}
 * @Date: 2020/11/6 11:44
 */
public class DemoClient {

    public static void main(String[] args) {
        Switch s = new Switch();
        s.open();
        s.close();
    }
}

运行结果

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值