外观模式/Facade模式(结构型)

思考问题:老板告诉秘书要到上海出差10天;老板告诉秘书要请8个人吃饭。如何设计?

解答:
1. 根据面相对象的思维,应该有一个Boss类,和Secretary秘书类,除此之外,还要有宾馆类Hotel,机场类Airport,酒店类Restaurant、司机类Chauffeur。
2. Boss对象只是跟秘书交谈而不是亲自去订机票和订房间等,所以机场类、酒店类、宾馆类和司机类四个组成一个子系统集,秘书类是一个外观角色类,对子系统中的四个类进行引用,Boss类无需知道子系统内部的各个类,只通过秘书安排工作。
外观模式/Facade模式(结构型)_第1张图片

机场

package com.shusheng.facade;
/**机场*/
public class Airport {

    public void bookTicket(String from,String to){
        System.out.println("订购了明天xx点从"+from+"到"+to+"的飞机票");
    }
}

司机类

package com.shusheng.facade;
/**司机类*/
public class Chauffeur {

    public void drive(String to){
        System.out.println("司机开车去"+to);
    }
}

宾馆

package com.shusheng.facade;
/**宾馆*/
public class Hotel {

    /**订住房*/
    public void reserve(int days){
        System.out.println("订购了"+days+"天的房间");
    }
}

酒店

package com.shusheng.facade;
/**酒店*/
public class Restaurant {

    public void reserve(int num){
        System.out.println("订了一桌"+num+"个人的酒席");
    }
}

秘书

package com.shusheng.facade;
import java.util.Date;

/**秘书*/
public class Secretary {

    private Airport airport = new Airport();
    private Hotel hotel = new Hotel();
    private Restaurant restaurant = new Restaurant();
    private Chauffeur chauffeur = new Chauffeur();

    /**安排出差*/
    public void trip(String to,int days){
        airport.bookTicket("北京",to);//订好机票(秘书必须知道自己在哪,所以不用传入出发地点)
        chauffeur.drive("机场");//开车去机场
        hotel.reserve(days);//订宾馆
    }

    /**安排饭局*/
    public void repast(int num){
        restaurant.reserve(num);
        chauffeur.drive("酒店");
    }
}

老板

package com.shusheng.facade;
/**老板类*/
public class Boss {
    /**模拟老板与秘书的交谈*/
    public static void main(String[] args) {
        Secretary secretary = new Secretary();
        System.out.println("老板告诉秘书要到上海出差10天");
        secretary.trip("上海",10);
        System.out.println("-----------------");
        System.out.println("老板告诉秘书要请8个人吃饭");
        secretary.repast(8);
    }
}

外观模式/Facade模式(结构型)_第2张图片
外观模式/Facade模式(结构型)_第3张图片

你可能感兴趣的:(外观模式,门面模式,Facade模式,结构型)