设计模式之外观模式

外观模式(FacadePattern)提供了一个统一的接口,用于与复杂的子系统交互,降低了客户代码与子系统间的耦合。在实例中,通过GeneralSwitchFacade类,实现了对灯光、风扇、空调和电视等设备的一站式控制,简化了开关操作。这种模式常用于需要为复杂系统提供简洁接口,或者减少不同组件间的相互依赖的情况。
摘要由CSDN通过智能技术生成

一.模式定义

  •  外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。

二.模式结构

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

 • SubSystem:子系统角色,实现系统的部分功能,客户可以通过外观角色访问它。

典型的外观角色代码:‘

 1 public class Facade
 2 {
 3     private SubSystemA obj1 = new SubSystemA();
 4     private SubSystemB obj2 = new SubSystemB();
 5     private SubSystemC obj3 = new SubSystemC();
 6     public void method()
 7     {
 8         obj1.method();
 9         obj2.method();
10         obj3.method();
11     }
12 } 

 模式实例-电源总开关

  •  外观角色类
 //外观角色类
  2 public class GeneralSwitchFacade {
  3     private Light lights[]=new Light[4];
  4     private Fan fan;
  5     private AirConditioner ac;
  6     private Television tv;
  7     
  8     public GeneralSwitchFacade()
  9     {
 10         lights[0]=new Light("左前");
 11         lights[1]=new Light("右前");
 12         lights[2]=new Light("左后");
 13         lights[3]=new Light("右后");    
 14         fan=new Fan();
 15         ac=new AirConditioner();
 16         tv=new Television();
 17     }
 18     //开灯业务
 19     public void on()
 20     {
 21         lights[0].on();
 22         lights[1].on();
 23         lights[2].on();
 24         lights[3].on();
 25         fan.on();
 26         ac.on();
 27         tv.on();
 28     } 
 29     //关灯业务    
 30     public void off()
 31     {
 32         lights[0].off();
 33         lights[1].off();
 34         lights[2].off();
 35         lights[3].off();
 36         fan.off();
 37         ac.off();
 38         tv.off();        
 39     }   
 40 }
  • 子系统类 Light
public class Light
  {
     private String position;
    
    public Light(String position)
     {
         this.position=position;    
    }
    
     public void on()
     {
        System.out.println(this.position + "灯打开!");
     }
    
   public void off()
    {
        System.out.println(this.position + "灯关闭!");    
    }
 }
  • 子系统类 Fan
 public class Fan
  {
     public void on()
      {
          System.out.println("风扇打开!");    
      }
      
      public void off()
      {
          System.out.println("风扇关闭!");        
      }
  }
  • 子系统类 AirConditioner
 public class AirConditioner
 {
     public void on()
      {
          System.out.println("空调打开!");
      }
     
     public void off()
      {
         System.out.println("空调关闭!");
      }
}
  • 子系统类 Television
public class Television
 {
      public void on()
     {
         System.out.println("电视机打开!");
     }
     
    public void off()
    {
        System.out.println("电视机关闭!");    
     }
}

三.使用场景

在以下情况下可以使用外观模式:

    • 当要为一个复杂子系统提供一个简单接口时可以使用外观模式。该接口可以满足大多数用户的需求,而且用户也可以越过外观类直接访问子系统。

    • 客户程序与多个子系统之间存在很大的依赖性。引入外观类将子系统与客户以及其他子系统解耦,可以提高子系统的独立性和可移植性。

    • 在层次化结构中,可以使用外观模式定义系统中每一层的入口,层与层之间不直接产生联系,而通过外观类建立联系,降低层之间的耦合度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值