美文网首页
外观模式(facade)

外观模式(facade)

作者: 简书网abc | 来源:发表于2021-06-28 23:17 被阅读0次
package main

import "fmt"

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

//像平时我们操作slice的时候,尤其是往slice中间插入、删除元素多有不便,
//我们可以在slice的外面套一层,使其更易使用。
//此外,由于使用了外观模式,使用者无需关心其内部实现,
//可以实现ArrayList和LinkedList的随心切换。

// 统一接口
type ListInter interface {
    Add(idx int, e interface{}) bool
    AddLast(e interface{}) bool
    Remove(idx int) (interface{}, bool)
    RemoveLast() (interface{}, bool)
    Get(idx int) (interface{}, bool)
}



// 然后有ArrayList的结构和构造方法,需要注意 capacity 的处理:
type ArrayList struct {
    ele  []interface{}
    size int
}

func NewArrayList(capacity int) *ArrayList {
    if capacity < 16 {
        capacity = 16
    }
    return &ArrayList{
        ele:  make([]interface{}, 0, capacity),
        size: 0,
    }
}
//此外,我们也可以根据传入的元素来创建一个ArrayList,这是构建外观的核心:
func ArrayListOf(ele ...interface{}) *ArrayList {
    return &ArrayList{
        ele:  ele,
        size: len(ele),
    }
}


// 接下来就是实现List接口的各种方法了,尤其要注意往中间插入元素和删除元素的处理:
func (a *ArrayList) Add(idx int, e interface{}) bool {
    if idx > a.size {
        return false
    }
    a.ele = append(a.ele, nil)
    copy(a.ele[idx+1:], a.ele[idx:]) // 后移一位, 把idx位置空出来
    a.ele[idx] = e
    a.size++
    return true
}

func (a *ArrayList) AddLast(e interface{}) bool {
    a.ele = append(a.ele, e)
    a.size++
    return true
}

func (a *ArrayList) Remove(idx int) (interface{}, bool) {
    if idx >= a.size {
        return nil, false
    }
    e := a.ele[idx]
    a.ele = append(a.ele[:idx], a.ele[idx+1:]...) // 跳过idx元素
    a.size--
    return e, true
}

func (a *ArrayList) RemoveLast() (interface{}, bool) {
    e := a.ele[a.size-1]
    a.ele = append(a.ele[:a.size-1])
    a.size--
    return e, true
}

func (a *ArrayList) Get(idx int) (interface{}, bool) {
    if idx >= a.size {
        return nil, false
    }
    e := a.ele[idx]
    return e, true
}

func (a *ArrayList) String() string {
    return fmt.Sprintf("size=%v, %v", a.size, a.ele)
}


func main() {
    var list ListInter
    list = NewArrayList(10)
    list.AddLast(1)
    list.AddLast(3)
    list.AddLast(4)
    list.Add(1, 2)
    fmt.Println(list)              // size=4, [1 2 3 4]
    fmt.Println(list.RemoveLast()) // 4 true
    fmt.Println(list)              // size=3, [1 2 3]
    fmt.Println(list.Remove(0))    // 1 true
    fmt.Println(list)              // size=2, [2 3]
    fmt.Println(list.Get(1))       // 3 true

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

    list = ArrayListOf(1, 2, 3, 4, 5, 6)
    fmt.Println(list)              // size=6, [1 2 3 4 5 6]
    fmt.Println(list.AddLast(7))   // true
    fmt.Println(list)              // size=7, [1 2 3 4 5 6 7]
    fmt.Println(list.Add(1, 100))  // true
    fmt.Println(list)              // size=8, [1 100 2 3 4 5 6 7]
    fmt.Println(list.Remove(1))    // 100 true
    fmt.Println(list)              // size=7, [1 2 3 4 5 6 7]
    fmt.Println(list.RemoveLast()) // 7 true
    fmt.Println(list)              // size=6, [1 2 3 4 5 6]
    fmt.Println(list.Get(2))       // 3 true
}

相关文章

  • Android 设计模式入门到精通之十:外观模式(Facade

    外观模式(Facade Pattern,门面模式) 1. 概念 Facade Pattern: Provide a...

  • Android设计模式——外观模式(七大结构型)

    1.外观模式介绍 外观模式(Facade Pattern),是七大结构型设计模式之一。 外观模式运...

  • 外观模式(Facade)

    定义外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一...

  • 外观模式-facade

    为子系统中的一组接口提供一个一致的界面,facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用 代...

  • 外观模式(Facade)

    1、概念 外观模式是外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,...

  • 外观模式(Facade)

    外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口是的这一子系统...

  • 外观模式(Facade)

    为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 类型 结...

  • 外观模式-Facade

    外观模式是为了解决类与类之间依赖关系的,外观模式将类间关系放在一个Facade类中,降低了类类之间的耦合度,该模式...

  • 外观模式(Facade)

    文章转自iOS设计模式:外观模式 基本概念 外观模式:为子系统的一组接口提供一个一致的界面,此模式定义一个高层接口...

  • 外观模式(facade)

    facade模式是为了简化操作,使用组合的方式提供一个统一的入口,而隐藏细节。 一般程序设计中很少使用外观模式,只...

网友评论

      本文标题:外观模式(facade)

      本文链接:https://www.haomeiwen.com/subject/deusyltx.html