第九章:外观模式

一、从一个故事开始

又是一年的九月,李力站在公寓的窗户边,望着对面的大学,看到一个个忙忙碌碌的拖着行李的身影,仿佛又回到了那个下午。Tony拖着一个行李箱,一路兜兜转转终于踏进了他梦寐以求的大学,“同学你好!我是Frank,负责新生报到的志愿者......”。在Frank的帮助下,Tony先到活动中心完成了报到登记,然后去缴费窗口缴完学费,之后又到生活中心领了生活用品,最后到宿舍完成了入住。

1.1用程序来模拟生活

package main

import "fmt"

type Register struct {

}

func (r *Register)register(name string) {
    fmt.Printf("活动中心:%s同学报到成功!\n",name)
}

type Payment struct {

}

func (p *Payment)Pay(name string,money int) {
    fmt.Printf("缴费中心:收到%s同学%d元付款,缴费成功!\n",name,money)
}

type DormitoryManagementCenter struct {

}

func (d *DormitoryManagementCenter) ProvideLivingGoods(name string) {
    fmt.Printf("生活中心:%s同学的生活用品已发放。\n",name)
}

type Dormitory struct {

}

func (d *Dormitory) MeetRoommate(name string) {
    fmt.Printf("宿  舍:大家好!这是刚来的%s同学,是你们未来需要共度四年的室友!相互认识一下......\n",name)
}

type Volunteer struct {
    name string
    register Register
    payment Payment
    lifeCenter DormitoryManagementCenter
    dormitory Dormitory
}

func (v *Volunteer)WelcomeFreshmen(name string){
    fmt.Printf("你好,%s同学!我是新生报到的志愿者%s,我将带你完成整个报道流程。\n",name,v.name)
    v.register.register(name)
    v.payment.Pay(name,1000)
    v.lifeCenter.ProvideLivingGoods(name)
    v.dormitory.MeetRoommate(name)
}

func testRegister(){
    r := Register{}
    p := Payment{}
    l := DormitoryManagementCenter{}
    d := Dormitory{}
    volunteer := Volunteer{"Frank",r,p,l,d}
    volunteer.WelcomeFreshmen("Tony")
}

func main()  {
    testRegister()
}

输出结果:

你好,Tony同学!我是新生报到的志愿者Frank,我将带你完成整个报道流程。
活动中心:Tony同学报到成功!
缴费中心:收到Tony同学1000元付款,缴费成功!
生活中心:Tony同学的生活用品已发放。
宿  舍:大家好!这是刚来的Tony同学,是你们未来需要共度四年的室友!相互认识一下......

Process finished with exit code 0

二、从剧情中思考外观模式

为子系统中的一组接口提供一个一致的界面称为外观模式,外观模式定义了一个高层接口,这个接口使得这一子系统更容易使用。

故事剧情中的志愿者就相当于一个对接人,将复杂的业务通过一个对接人 来提供一整套统一的(一条龙式的服务),让用户不在关心内部的复杂运行机制。这种方式在程序中叫外观模式,也叫门面模式。
外观模式的核心思想:用一个简单的接口来封装一个复杂的系统,使这个系统更容易使用。

三、外观模式的模型抽象

3.1类图

image.png

Facade封装了子系统的复杂实现,给外部提供一个统一的接口,用户只需要通过Facade来访问子系统,而不用关心内部ClassA、ClassB、ClassC、ClassD的具体实现。

3.2模型说明

1.设计要点
外观模式是最简单的设计模式之一,只有以下两个角色。
● 外观角色(Façade):为子系统封装统一的对外接口,如同子系统的门面。这个类一般不负责具体的业务逻辑,只是一个委托类,具体的业务逻辑由子系统完成。
● 子系统(SubSystem):由多个类组成的具有某一特定功能的子系统。可以是第三方库,也可以是自己的基础库,还可以是一个子服务,为整个系统提供特定的功能或服务。”
2.外观模式的优缺点
优点:
(1)实现了子系统与客户端之间的松耦合关系,这使得子系统的变化不会影响调用它的客户端。
(2)简化了客户端对子系统的使用难度,客户端(用户)无须关心子系统的具体实现方式,而只需要和外观进行交互即可。
(3)为不同的用户提供了统一的调用接口,方便了系统的管理和维护。
缺点:
因为统一了调用的接口,降低了系统功能的灵活性。

四、应用场景

(1)要为一个复杂子系统提供一个简单接口时。
(2)客户程序与多个子系统之间存在很大的依赖性时。引入外观类将子系统与客户以及其他子系统解耦,可以提高子系统的独立性和可移植性。
(3)在层次化结构中,可以使用外观模式定义系统中每一层的入口,层与层之间不直接产生联系,而通过外观类建立联系,降低层之间的耦合度。
资料:
人人都懂设计模式:从生活中领悟设计模式:Python实现

你可能感兴趣的:(第九章:外观模式)