Facade Pattern

   外观模式其实就是把复杂的东西给封装,由统一的接口进行操作。这样可以简化用户的使用。

例子

  如果要开一家饭馆,一个饭馆分为采购的,管仓库的,切菜的,炒菜的,吃菜的。

  而采购的,管仓库的,切菜的,炒菜的,是厨房。吃菜的,是客户。客户并不希望知道厨房工作的细节,只希望告诉厨房自己想吃什么就行了,他不想告诉厨房要去买什么菜,怎么切,怎么炒。而巧的是,厨房也只希望给客户提供有限的选择即可,具体工作的细节由自己控制就行。因此厨房和客户之间只隔着一个菜单和服务员。

实现

  先来实现厨房的各个部门

package facade// 虽然把蔬菜定义在厨房的采购部并不合理
// 但是我还是这么做了
const (STATUS_BUYED  = iotaSTATUS_STOREDSTATUS_CUTEDSTATUS_COOKEDSTATUS_EATED
)type VegStatus inttype Vegetable struct {name   stringstatus VegStatus
}func BuyVegetable(name string) *Vegetable {return &Vegetable{name, STATUS_BUYED}
}func Eat(veg *Vegetable) {veg.status = STATUS_EATED
}
package facade
//  买回来就要保存
var storage []*Vegetable = make([]*Vegetable, 0)func SaveVegetables(veg ...*Vegetable) {storage = append(storage,veg...)for _,v := range veg{v.status=STATUS_STORED}
}func GetVegetables() *Vegetable {l := len(storage)res := storage[l-1]storage = storage[:l-1]return res
}
package facade
//  切菜
//  具体拿去做什么不知道
//  只管切
func CutVegtable(veg ...*Vegetable)[]*Vegetable{for _,v := range veg{v.status=STATUS_CUTED}return veg
}
package facade
//  炒菜
//  给谁吃不知道
//  炒就是了
func CookVegtable(vec ...*Vegetable)[]*Vegetable{for _,v := range vec{v.status=STATUS_COOKED}return vec
}
package facade//  菜单
//  客户随意选择
//  制作方式可以由主厨决定
//  只要客户喜欢
func SauteVegtable()[]*Vegetable{qc := BuyVegetable("青菜")suan := BuyVegetable("蒜")jiang := BuyVegetable("姜")SaveVegetables(qc,suan,jiang)vegs := CookVegtable(CutVegtable(storage...)...)return vegs
}

使用

func EatVegtables(veg ...*Vegetable){for _,v :=range veg{Eat(v)}
}func main(){// No Facadebc := BuyVegetable("白菜")SaveVegetables(bc)vecs := CookVegtable(GetVegetables())EatVegtables(vecs...)for _,v := range vecs{fmt.Println(*v)}// FavadesauteVegtable := SauteVegtable()EatVegtables(sauteVegtable...)for _,v := range sauteVegtable{fmt.Println(*v)}
}

优缺点

优点

  • 它对客户屏蔽子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便。
  • 它实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。

缺点

  • 增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。
  • 对客户访问子系统类做太多的限制则减少了可变性和灵活性。

应用情景

  • 当要为一个复杂子系统提供一个简单接口时可以使用外观模式。
  • 客户程序与多个子系统之间存在很大的依赖性。
  • 在分层结构中,可以使用外观模式定义系统中每一层的入口,层与层之间不直接产生联系,而通过外观类建立联系,降低层之间的耦合度。

【寒江雪】Go实现外观模式相关推荐

  1. 设计模式之外观模式(Facade)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  2. 设计模式C#实现(三)——外观模式

    外观模式--提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口让子系统更容易使用. 一个外观包含了为许多对象和对他们的操作,使得重复这些操作更方便. 假如客厅里有灯(Lights ...

  3. [设计模式]外观模式

    1. 定义 外观模式 提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更加容易使用. 外观不仅简化了系统内接口的使用,也将客户从组件中的子系统中解耦,外观和适配器都可 ...

  4. 外观模式 - 设计模式学习

    外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 怎么叫更加容易使用呢?多个方法变成一个方法,在外观看来,只需知道这个功 ...

  5. Python设计模式-外观模式

    Python设计模式-外观模式 代码基于3.5.2,代码如下; #coding:utf-8 # 外观模式class AlarmSensor:def run(self):print("Alar ...

  6. 设计模式之外观模式php,php设计模式(十五)外观模式

    外观模式又叫门面模式: 现在都是模块化开发了: 开发中很多时候都是在使用各种扩展包: 或者在外观模式中我们叫做子系统: 外观模式的作用就是减少子系统之间的耦合: 降低子系统的使用难度: 我们举个栗子: ...

  7. PHP设计模式 外观模式(Facade)

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

  8. 漫画:设计模式之 “外观模式”

    作者 | 小灰 来源 | 程序员小灰(ID:chengxuyuanxiaohui) -----  第二天  ----- ------------ 首先,肯德基提供了众多基础菜品,比如鸡翅.汉堡.薯条. ...

  9. 十一:外观模式详解(Service,action与dao)

    定义:外观模式是软件工程中常用的一种软件设计模式.它为子系统中的一组接口提供一个统一的高层接口.这一接口使得子系统更加容易使用. 该定义引自百度百科,它的表现很简单,将一系列子接口的功能进行整理,从而 ...

最新文章

  1. 2020年Java程序员不得不学习的10大技术
  2. python 查看 nvida 驱动、 cuda、pytorch、tensorflow的版本
  3. JMeter和JMeterPlugin的下载安装
  4. flink的savepoints和checkpoints以及state Query(暂时无法全部完成)
  5. [linux]【编译】【高级01】 - 动态库的设定和依赖性的检查 20160921更新 文章没有最终结案
  6. 给92号油的汽车加95,为何老司机还说省钱?
  7. 在struct 中使用string,赋值会报错
  8. 第一个IOS APP总结
  9. 操作系统 unix v6
  10. 拿什么拯救你,我的头发丝--PS抠图神器
  11. windows温度监控效果最棒的软件 | Windows桌面优化、功能增强软件
  12. python微信推送{u‘errcode‘: 40008, u‘errmsg‘: u‘invalid message type rid: 6111061f-19703d5b
  13. 机器人及其相关零件的发展
  14. WPF QQ群发助手
  15. windows 配置中科大的 Rust 下载云,提高下载速度
  16. Samy 蠕虫代码
  17. LLC谐振变换器的寄生参数对谐振过程影响分析
  18. Asp.net的CheckBox控件和CheckBoxList控件
  19. 计蒜客--蒜头君的新游戏
  20. Android 百度文字识别(详细步骤+源码)

热门文章

  1. 两台计算机互联方案,如何让两台电脑直接用网线互联.docx
  2. linux centos无法进入系统,centos无法进入桌面系统
  3. html5画图程序,基于HTML5的Windows画图程序
  4. css 里面写响应式布局,CSS3怎么做出响应式布局
  5. 【20保研】中南大学计算机学院2019年全国优秀大学生暑期夏令营通知
  6. 【Unity】StreamingAssets和PersistentData文件夹
  7. vue项目中汉字转拼音
  8. 20130327-[转]讲完这个故事我就要嫁给别人
  9. 中国特种腈行业市场供需与战略研究报告
  10. OpenHarmony HDF Input框架模块 按键控制LED基于小熊派micro