首页 > 其他分享 >11 外观模式 -- go语言设计模式

11 外观模式 -- go语言设计模式

时间:2023-08-12 10:31:57浏览次数:38  
标签:11 struct -- fmt func Println 设计模式 hp

外观模式又称为门面模式,它是一种结构型模式。引入外观模式后调用方与多个子系统的通信必须通过一个统一的外观对象进行,外观模式为子系统中的功能接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这些子系统更加容易使用。

外观模式的实现代码

package main

import "fmt"

//电视机
type TV struct {}

func (t *TV) On() {
	fmt.Println("打开 电视机")
}

func (t *TV) Off() {
	fmt.Println("关闭 电视机")
}


//电视机
type VoiceBox struct {}

func (v *VoiceBox) On() {
	fmt.Println("打开 音箱")
}

func (v *VoiceBox) Off() {
	fmt.Println("关闭 音箱")
}

//灯光
type Light struct {}

func (l *Light) On() {
	fmt.Println("打开 灯光")
}

func (l *Light) Off() {
	fmt.Println("关闭 灯光")
}


//游戏机
type Xbox struct {}

func (x *Xbox) On() {
	fmt.Println("打开 游戏机")
}

func (x *Xbox) Off() {
	fmt.Println("关闭 游戏机")
}


//麦克风
type MicroPhone struct {}

func (m *MicroPhone) On() {
	fmt.Println("打开 麦克风")
}

func (m *MicroPhone) Off() {
	fmt.Println("关闭 麦克风")
}

//投影仪
type Projector struct {}

func (p *Projector) On() {
	fmt.Println("打开 投影仪")
}

func (p *Projector) Off() {
	fmt.Println("关闭 投影仪")
}


//家庭影院(外观)
type HomePlayerFacade struct {
	tv TV
	vb VoiceBox
	light Light
	xbox Xbox
	mp MicroPhone
	pro Projector
}


//KTV模式
func (hp *HomePlayerFacade) DoKTV() {
	fmt.Println("家庭影院进入KTV模式")
	hp.tv.On()
	hp.pro.On()
	hp.mp.On()
	hp.light.Off()
	hp.vb.On()
}

//游戏模式
func (hp *HomePlayerFacade) DoGame() {
	fmt.Println("家庭影院进入Game模式")
	hp.tv.On()
	hp.light.On()
	hp.xbox.On()
}

func main() {
	homePlayer := new(HomePlayerFacade)

	homePlayer.DoKTV()

	fmt.Println("------------")

	homePlayer.DoGame()
}

终端输出

1.png

外观模式的代码拆分

1.项目的准备工作

找到 go 的 GOPATH

$ go env		//可以查看 GOPATH

在 GOPATH 目录下创建3个文件夹

1.bin文件夹		-- 存放编译后的二进制文件

2.pkg文件夹		-- 存放编译后的库文件

3.src文件夹		-- 存放源码文件

2.创建文件夹

//	-- 在项目文件夹 facade_case 里创建新文件夹

//	facade	-- 存放装饰者的全部文件

2.png

3.接口文件 -- facade文件夹

​ -- 无接口文件

4.结构体文件 -- facade文件夹

文件1 -- tv.go

package facade

import "fmt"

//电视机
type TV struct {}

func (t *TV) On() {
	fmt.Println("打开 电视机")
}

func (t *TV) Off() {
	fmt.Println("关闭 电视机")
}

文件2 -- voicebox.go

package facade

import "fmt"

//音箱
type VoiceBox struct {}

func (v *VoiceBox) On() {
	fmt.Println("打开 音箱")
}

func (v *VoiceBox) Off() {
	fmt.Println("关闭 音箱")
}

文件3 -- light.go

package facade

import "fmt"

//灯光
type Light struct {}

func (l *Light) On() {
	fmt.Println("打开 灯光")
}

func (l *Light) Off() {
	fmt.Println("关闭 灯光")
}

文件4 -- xbox.go

package facade

import "fmt"

//游戏机
type Xbox struct {}

func (x *Xbox) On() {
	fmt.Println("打开 游戏机")
}

func (x *Xbox) Off() {
	fmt.Println("关闭 游戏机")
}

文件5 -- microphone.go

package facade

import "fmt"

//麦克风
type MicroPhone struct {}

func (m *MicroPhone) On() {
	fmt.Println("打开 麦克风")
}

func (m *MicroPhone) Off() {
	fmt.Println("关闭 麦克风")
}

文件6 -- projector.go

package facade

import "fmt"

//投影仪
type Projector struct {}

func (p *Projector) On() {
	fmt.Println("打开 投影仪")
}

func (p *Projector) Off() {
	fmt.Println("关闭 投影仪")
}

文件7 -- homeplayerfacade.go

package facade

import "fmt"

//家庭影院(外观)
type HomePlayerFacade struct {
	tv TV
	vb VoiceBox
	light Light
	xbox Xbox
	mp MicroPhone
	pro Projector
}

//KTV模式
func (hp *HomePlayerFacade) DoKTV() {
	fmt.Println("家庭影院进入KTV模式")
	hp.tv.On()
	hp.pro.On()
	hp.mp.On()
	hp.light.Off()
	hp.vb.On()
}

//游戏模式
func (hp *HomePlayerFacade) DoGame() {
	fmt.Println("家庭影院进入Game模式")
	hp.tv.On()
	hp.light.On()
	hp.xbox.On()
}

5.主文件 -- main.go 在项目文件夹

package main

import (
	"design/facade_case/facade"
	"fmt"
)

func main() {
	homePlayer := new(facade.HomePlayerFacade)

	homePlayer.DoKTV()

	fmt.Println("------------")

	homePlayer.DoGame()
}

终端输出

3.png

6.全部文件图

4.png

标签:11,struct,--,fmt,func,Println,设计模式,hp
From: https://blog.51cto.com/u_14483476/7056868

相关文章

  • 简单工厂模式
     目录前言导语代码部分总结前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷导语简单工厂模式编辑......
  • 二分板子
    1.求最大值最小while(l<=r){  mid=(l+r)>>1;  if(check(mid))ans=mid,r=mid-1;    elsel=mid+1; }例题洛谷p3853路标设置code#include<bits/stdc++.h>usingnamespacestd;intl,n,k,a[100010],r,ll,mid,ans,cnt;boolcheck......
  • 产品代码都给你看了,可别再说不会DDD(一):DDD入门
    这是一个讲解DDD落地的文章系列,作者是《实现领域驱动设计》的译者滕云。本文章系列以一个真实的并已成功上线的软件项目——码如云(https://www.mryqr.com)为例,系统性地讲解DDD在落地实施过程中的各种典型实践,以及在面临实际业务场景时的诸多取舍。本系列包含以下文章:DDD入门(本......
  • Postman基础
    Postman基础参考博客:如何使用postman做接口测试常用的接口测试工具主要有以下几种:Postman:简单方便的接口调试工具,便于分享和协作。具有接口调试,接口集管理,环境配置,参数化,断言,批量执行,录制接口,MockServer,接口文档,接口监控等功能;JMeter:开源接口测试及压测工具,支持Lin......
  • quarkus依赖注入之十三:其他重要知识点大串讲(终篇)
    欢迎访问我的GitHub这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos本篇概览本篇是《quarkus依赖注入》系列的终篇,前面十二篇已覆盖quarkus依赖注入的大部分核心内容,但依然漏掉了一些知识点,今天就将剩下的内容汇总,来个一锅端,轻松愉快的结......
  • pycharm常用快捷键
    pycharm常用快捷键参考:https://blog.csdn.net/pipisorry/article/details/39909057打开pycharm>help>keymapReference1、编辑(Editing)Ctrl+Space基本的代码完成(类、方法、属性)Ctrl+Alt+Space快速导入任意类Ctrl+Shift+Enter语句完成Ctrl+P参数信息......
  • Ubuntu18_最小化安装
    Ubuntu18最小化安装python3.6环境参考文档:https://blog.csdn.net/baidu_36602427/article/details/86548203​ https://blog.csdn.net/ztl0013/article/details/536953471、安装Ubuntu182、安装VMwaretools工具2.1、开启虚拟机2.2、安装VMwareTools等待Linux操作......
  • Pycharm用virtualenv创建Django
    解决Pycharm用virtualenv创建Django一.问题描述用Pycharm的虚拟环境下(virtualenv)创建Django,报错:FileNotFoundError:[Errno2]Nosuchfileordirectory:'E:\Anaconda\lib\venv\scripts\nt\python.exe'二.报错原因在网上找到的产生这个问题的原因是:这是一个调试二进制......
  • Pycharm集成码云
    Pycharm集成码云说到Git代码托管平台,首先推荐的是GitHub,好多好的开源项目都来自GitHub,但是GitHub只能新建公开的Git仓库,私有仓库要收费,如果你做的是一个开源项目,可以首选GitHub。但如果建立私有仓库托管,可以通过码云保管你的代码。码云(gitee.com)是开源中国推出的代码托管平台,......
  • Wireshark使用介绍
    Wireshark使用介绍参考博客:wireshark抓包新手使用教程Wireshark零基础使用教程(超详细)......