老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)

go中設(shè)計(jì)模式之結(jié)構(gòu)型模式

外觀模式

1. 定義: 外部與一個(gè)子系統(tǒng)通信必須通過(guò)一個(gè)統(tǒng)一的對(duì)象進(jìn)行,為子系統(tǒng)中的一組接口提供一致界面。

2. 代碼示例:

// 定義對(duì)外API
type API interface {
    Test()
}

func NewAPI() API {
    return apiImpl{newMod()}
}

type apiImpl struct {
    m mod
}

func (a apiImpl) Test() {
    a.m.mod()
}

// 需要交互的內(nèi)部模塊
type mod interface {
    mod()
}

func newMod() mod {
    return modImpl{}
}

type modImpl struct {
}

func (m modImpl) mod() {

}

3. 實(shí)現(xiàn)步驟

  • 定義內(nèi)部模塊
  • 定義對(duì)外交互接口及實(shí)現(xiàn)

4. 使用場(chǎng)景

  • 當(dāng)要為一個(gè)復(fù)雜子系統(tǒng)提供一個(gè)簡(jiǎn)單接口時(shí)可以使用外觀模式。該接口可以滿足大多數(shù)用戶的需求,而且用戶也可以越過(guò)外觀類直接訪問(wèn)子系統(tǒng)。
  • 客戶程序與多個(gè)子系統(tǒng)之間存在很大的依賴性。引入外觀類將子系統(tǒng)與客戶以及其他子系統(tǒng)解耦,可以提高子系統(tǒng)的獨(dú)立性和可移植性。
  • 在層次化結(jié)構(gòu)中,可以使用外觀模式定義系統(tǒng)中每一層的入口,層與層之間不直接產(chǎn)生聯(lián)系,而通過(guò)外觀類建立聯(lián)系,降低層之間的耦合度。

5. 優(yōu)點(diǎn)

對(duì)客戶屏蔽子系統(tǒng)組件

成都創(chuàng)新互聯(lián)主要從事成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)七星,十余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):18982081108

適配器模式

1. 定義: 將一個(gè)接口轉(zhuǎn)換成客戶希望的另一個(gè)接口。

2. 代碼示例:

// 定義被適配的接口
type Adapter interface {
    Request() string
}

type adaptee struct {
}

func (adaptee) Request() string {
}

func NewAdapter() Adapter {
    return &adaptee{}
}

// 定義目標(biāo)接口
type Target interface {
    TargetRequest() string
}

func New(adapter Adapter) Target {
    return &target{adapter}
}

type target struct {
    Adapter
}

func (t *target) TargetRequest() {
    t.Request()
}

3. 實(shí)現(xiàn)步驟

  • 定義被適配的接口和實(shí)現(xiàn)
  • 定義目標(biāo)接口和實(shí)現(xiàn),并且實(shí)現(xiàn)接口由被適配接口創(chuàng)建

4. 使用場(chǎng)景

系統(tǒng)需要使用現(xiàn)有的類,而這些類的接口不符合系統(tǒng)的需要。

5. 優(yōu)點(diǎn)

將目標(biāo)類和適配者類解耦,通過(guò)引入一個(gè)適配器類來(lái)重用現(xiàn)有的適配者類,而無(wú)須修改原有代碼。

裝飾模式

1. 定義: 動(dòng)態(tài)地給一個(gè)對(duì)象增加一些額外的職責(zé)。

2. 代碼示例:

// 定義組件
type Component interface {
    Calc() int
}

type ConcreteComponent struct{}

func (*ConcreteComponent) Calc() int {
    return 0
}

// 定義裝飾對(duì)象
type MulDecorator struct {
    Component
    num int
}

func WarpMulDecorator(c Component, num int) Component {
    return &MulDecorator{
        Component: c,
        num:       num,
    }
}

func (d *MulDecorator) Calc() int {
    return d.Component.Calc() * d.num
}

type AddDecorator struct {
    Component
    num int
}

func WarpAddDecorator(c Component, num int) Component {
    return &AddDecorator{
        Component: c,
        num:       num,
    }
}

func (d *AddDecorator) Calc() int {
    return d.Component.Calc() + d.num
}

3. 實(shí)現(xiàn)步驟

  • 定義組件
  • 定義裝飾對(duì)象
  • 使用裝飾對(duì)象生成組件

4. 使用場(chǎng)景

在不影響其他對(duì)象的情況下,以動(dòng)態(tài)、透明的方式給單個(gè)對(duì)象添加職責(zé)。

5. 優(yōu)點(diǎn)

可以通過(guò)一種動(dòng)態(tài)的方式來(lái)擴(kuò)展一個(gè)對(duì)象的功能,通過(guò)配置文件可以在運(yùn)行時(shí)選擇不同的裝飾器,從而實(shí)現(xiàn)不同的行為。

享元模式

1. 定義: 享元模式通過(guò)共享技術(shù)實(shí)現(xiàn)相同或相似對(duì)象的重用。

2. 代碼示例:

// 定義享元對(duì)象
type ImageFlyweight struct {
    data string
}

func NewImageFlyweight(filename string) *ImageFlyweight {
    // Load image file
    data := fmt.Sprintf("image data %s", filename)
    return &ImageFlyweight{
        data: data,
    }
}

func (i *ImageFlyweight) Data() string {
    return i.data
}

// 定義享元對(duì)象工廠
type ImageFlyweightFactory struct {
    maps map[string]*ImageFlyweight
}

var imageFactory *ImageFlyweightFactory

func GetImageFlyweightFactory() *ImageFlyweightFactory {
    if imageFactory == nil {
        imageFactory = &ImageFlyweightFactory{
            maps: make(map[string]*ImageFlyweight),
        }
    }
    return imageFactory
}

func (f *ImageFlyweightFactory) Get(filename string) *ImageFlyweight {
    image := f.maps[filename]
    if image == nil {
        image = NewImageFlyweight(filename)
        f.maps[filename] = image
    }

    return image
}

type ImageViewer struct {
    *ImageFlyweight
}

func NewImageViewer(filename string) *ImageViewer {
    image := GetImageFlyweightFactory().Get(filename)
    return &ImageViewer{
        ImageFlyweight: image,
    }
}

func (i *ImageViewer) Display() {
    fmt.Printf("Display: %s\n", i.Data())
}

3. 實(shí)現(xiàn)步驟

  • 定義享元對(duì)象
  • 定義享元工廠
  • 使用享元工廠創(chuàng)建

4. 使用場(chǎng)景

  • 一個(gè)系統(tǒng)有大量相同或者相似的對(duì)象,由于這類對(duì)象的大量使用,造成內(nèi)存的大量耗費(fèi)。
    對(duì)象的大部分狀態(tài)都可以外部化,可以將這些外部狀態(tài)傳入對(duì)象中。
  • 使用享元模式需要維護(hù)一個(gè)存儲(chǔ)享元對(duì)象的享元池,而這需要耗費(fèi)資源,因此,應(yīng)當(dāng)在多次重復(fù)使用享元對(duì)象時(shí)才值得使用享元模式。

5. 優(yōu)點(diǎn)

享元模式從對(duì)象中剝離出不發(fā)生改變且多個(gè)實(shí)例需要的重復(fù)數(shù)據(jù),獨(dú)立出一個(gè)享元,使多個(gè)對(duì)象共享,從而節(jié)省內(nèi)存以及減少對(duì)象數(shù)量。

代理模式

1. 定義: 給某一個(gè)對(duì)象提供一個(gè)代理,并由代理對(duì)象控制對(duì)原對(duì)象的引用。

2. 代碼示例:

package proxy

type Subject interface {
    Do() string
}

type RealSubject struct{}

func (RealSubject) Do() string {
    return "real"
}

type Proxy struct {
    real RealSubject
}

func (p Proxy) Do() string {
    var res string

    // 在調(diào)用真實(shí)對(duì)象之前的工作,檢查緩存,判斷權(quán)限,實(shí)例化真實(shí)對(duì)象等。。
    res += "pre:"

    // 調(diào)用真實(shí)對(duì)象
    res += p.real.Do()

    // 調(diào)用之后的操作,如緩存結(jié)果,對(duì)結(jié)果進(jìn)行處理等。。
    res += ":after"

    return res
}

3. 實(shí)現(xiàn)步驟

  • 定義接口
  • 定義實(shí)現(xiàn)對(duì)象
  • 定義代理實(shí)現(xiàn)對(duì)象

4. 使用場(chǎng)景

  • 并由代理對(duì)象控制對(duì)原對(duì)象的引用,增加請(qǐng)求注入劫持

5. 優(yōu)點(diǎn)

代理模式能夠協(xié)調(diào)調(diào)用者和被調(diào)用者,在一定程度上降低了系統(tǒng)的耦合度。

橋接模式

1. 定義: 給某一個(gè)對(duì)象提供一個(gè)代 理,并由代理對(duì)象控制對(duì)原對(duì)象的引用。

2. 代碼示例:

package bridge

import "fmt"

type AbstractMessage interface {
    SendMessage(text, to string)
}

type MessageImplementer interface {
    Send(text, to string)
}

type MessageSMS struct{}

func ViaSMS() MessageImplementer {
    return &MessageSMS{}
}

func (*MessageSMS) Send(text, to string) {
    fmt.Printf("send %s to %s via SMS", text, to)
}

type MessageEmail struct{}

func ViaEmail() MessageImplementer {
    return &MessageEmail{}
}

func (*MessageEmail) Send(text, to string) {
    fmt.Printf("send %s to %s via Email", text, to)
}

type CommonMessage struct {
    method MessageImplementer
}

func NewCommonMessage(method MessageImplementer) *CommonMessage {
    return &CommonMessage{
        method: method,
    }
}

func (m *CommonMessage) SendMessage(text, to string) {
    m.method.Send(text, to)
}

type UrgencyMessage struct {
    method MessageImplementer
}

func NewUrgencyMessage(method MessageImplementer) *UrgencyMessage {
    return &UrgencyMessage{
        method: method,
    }
}

func (m *UrgencyMessage) SendMessage(text, to string) {
    m.method.Send(fmt.Sprintf("[Urgency] %s", text), to)
}

3. 實(shí)現(xiàn)步驟

4. 使用場(chǎng)景

5. 優(yōu)點(diǎn)


網(wǎng)頁(yè)標(biāo)題:go中設(shè)計(jì)模式之結(jié)構(gòu)型模式
文章分享:http://www.xueling.net.cn/article/ijjioj.html

其他資訊

在線咨詢
服務(wù)熱線
服務(wù)熱線:028-86922220
TOP
主站蜘蛛池模板: 午夜无码片在线观看影院Y 韩国精品网站 | 樱花草无码专区日本 | 国产专区自拍 | 91精品啪啪 | 免费爆乳精品一区二区 | 中国在线观看免费高清视频播放 | 欧美午夜精品久久久久久人妖 | 欧美一区=区三区 | 亚洲高清免费看 | www.波多野结衣.com | 日皮视频在线观看 | 神马老子影院午夜观看网站 | 国色天香乱码区 | 精品人妻中文av一区二区三区 | 国产一卡2卡3卡4卡新区乱码在 | 久久精品无码一区二区无码 | 欧美一级视频在线观看 | 中文字幕人成无码人妻 | 国产高清自拍视频 | 欧美一个色资源 | 男人脱了美女内衣摸她胸视频 | 色香蕉成人二区免费 | 无码H肉3D动漫在线观看 | 日韩在线看片 | 97久久久国产精品 | 亚洲乱亚洲乱妇 | 久久不见久久见免费影院观看 | 又黄又爽吃奶视频在线观看 | 色婷婷亚洲婷婷 | 97公开免费视频 | 女女女女bbbb毛片免费视频 | 亚洲av无码成人精品国产 | 国产麻豆VIDEOXXXX实拍 | 成人一区二区三区视频在线观看 | 中日韩黄色一级片 | 四虎成人精品无码 | 野外少妇愉情中文字幕 | 午夜男人网站 | 天下第一社区视频在线观看 | 亚洲在线中字幕 | 欧美一级片在线观看 |