美文网首页
外观模式(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
    }
    

    相关文章

      网友评论

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

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