1. 程式人生 > 其它 >LeetCode——240. 搜尋二維矩陣 II(Java)

LeetCode——240. 搜尋二維矩陣 II(Java)

TIP

好的文章必須要有自己的觀點輸出,如果自己想的不全的,或者有問題的,再查資料核對再進行補充。

定義#

TIP

認識和講述一個事,必須要先深入理解他的概念開始

  • 諸葛亮錦囊妙計模型

趙子龍得到諸葛亮的錦囊,順利幫助劉備讓周瑜陪了夫人折了兵;其中錦囊中三個字條對應三個妙計(可以抽象繼承一個介面,也可以各自是一個介面), 錦囊對應環境(context供趙雲執行者使用) 總結三個角色: context封裝 / strategy抽象策略 / concreteStrategy 具體策略

  • 演算法模型

定義一些演算法,把每個演算法都封裝起來,讓他們之間可以相互替代 三個角色 不同的演算法:concreteStrategy 實現演算法的介面:strategy 相互替換 context 封裝實現

  • 鴨子模型

設計原則 封裝變化,讓演算法的變化和使用演算法的客戶分離開;多用組合,少用繼承;

wiki

UML圖#

Demo#

妙計 (結構易,實現難)#

evictionAlgo.go


package main
type evictionAlgo interface {    evict(c *cache)}

fifo.go

package main
import "fmt"
type fifo struct {
}
func (l *fifo)evict(c *cache){    fmt.Println("Evicting by fifo strategy")}

lru.go

package main
import "fmt"
type lru struct {
}
func (l *lru) evict(c *cache){        fmt.Println("Evicting by lru strategy")}

錦囊 (有套路結構難,實現易)#

cache.go


package main
type cache struct {    storage map[string]string    evictionAlgo evictionAlgo    capacity int    maxCapacity int}
func initCache(e evictionAlgo) *cache{    storage := make(map[string]string)    return &cache{        storage: storage,        evictionAlgo: e,        capacity: 0,        maxCapacity: 2,    }}
//中介軟體方法,對外提供一個方法給外部呼叫,對內呼叫內部的方法實現解耦func (c *cache) setEvictionAlgo(e evictionAlgo){    c.evictionAlgo = e}
func (c *cache) add(key,value string){    if c.capacity == c.maxCapacity{        c.evict()    }    c.capacity ++    c.storage[key] = value}
func (c *cache) get(key string){    delete(c.storage,key)}
func (c *cache) evict(){    c.evictionAlgo.evict(c)    c.capacity --}

使用客戶#

main.go


package main
func main(){    lru := &lru{}    cache := initCache(lru)    cache.add("a","1")    cache.add("b","2")    cache.add("c","3")    fifo := &fifo{}    cache.setEvictionAlgo(fifo)    cache.add("d","4")    cache.setEvictionAlgo(lru)    cache.add("e","4")}