设计模式 - 外观模式

设计模式 - 外观模式

场景

小张搬家了,新的房间都是智能化,但是每个设备都是独立的,小张每次回家之前需要打开app分别打开每个设备,例如小张回家后的基本操作是开门,打开电灯,把书从书架拿下来放到桌子上然后自动翻到昨日读到页码。这三个三个操作,小张需要分别操作三次,作为程序员小张觉得这个太不自动化了。他想把这三个变成一件事情而不是三件事。

小张想自己应该封装一下,把三个步骤变成一个操作。

外观模式

外观模式:提供一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。

uml类图

!

book类

package xuelongjiang.designpartten.facade;

/**
 * @Author xuelongjiang
 */
public class Book {

    public void watch(){
        System.out.println("从书架拿书");
    }

    public void over(){
        System.out.println("把书放回书架");
    }

}

Light类

package xuelongjiang.designpartten.facade;

/**
 * @Author xuelongjiang
 */
public class Light {


    public void on(){
        System.out.println("开灯");
    }

    public void off(){
        System.out.println("关灯");
    }



}

door类

package xuelongjiang.designpartten.facade;

/**
 * @Author xuelongjiang
 */
public class Door {

    public void on(){
        System.out.println("开门");
    }

    public void off(){
        System.out.println("关门");
    }


}

外观类

package xuelongjiang.designpartten.facade;

/**
 *
 * 外观模式: 提供子系统一个简化的接口
 *
 *
 * @Author xuelongjiang
 */
public class FacadePattern {

     private Book book;
     private Light light;
     private Door door;

    public FacadePattern(Book book, Light light, Door door) {
        this.book = book;
        this.light = light;
        this.door = door;
    }


    public void goHome(){
        door.on();
        light.on();
        book.watch();
    }


    public void goWork(){

        book.over();
        light.off();
        door.off();

    }

}

测试类

package xuelongjiang.designpartten.facade;

/**
 * @Author xuelongjiang
 */
public class FacadeTest {

    public static void main(String[] args) {

        Book book = new Book();
        Light light = new Light();
        Door door = new Door();

        FacadePattern facadePattern  = new FacadePattern(book,light,door);

        facadePattern.goHome();
        System.out.println("-------------");
        facadePattern.goWork();
    }
}

要点

  • 当需要简化并统一一个很大的接口或者一群很复杂的接口时,使用外观
  • 外观将客户从一个复杂的子系统中解耦(FacadeTest就是客户类)
  • 实现一个外观,需要将子系统组合进外观中,然后将工作委托给子系统执行
  • 你可以为一个子系统实现一个以上的外观

猜你喜欢

转载自blog.csdn.net/u013565163/article/details/79294707