LeetCode——240. 搜尋二維矩陣 II(Java)
阿新 • • 發佈:2021-10-25
TIP
好的文章必須要有自己的觀點輸出,如果自己想的不全的,或者有問題的,再查資料核對再進行補充。
定義#
認識和講述一個事,必須要先深入理解他的概念開始
- 諸葛亮錦囊妙計模型
趙子龍得到諸葛亮的錦囊,順利幫助劉備讓周瑜陪了夫人折了兵;其中錦囊中三個字條對應三個妙計(可以抽象繼承一個介面,也可以各自是一個介面), 錦囊對應環境(context供趙雲執行者使用) 總結三個角色: context封裝 / strategy抽象策略 / concreteStrategy 具體策略
- 演算法模型
定義一些演算法,把每個演算法都封裝起來,讓他們之間可以相互替代 三個角色 不同的演算法:concreteStrategy 實現演算法的介面:strategy 相互替換 context 封裝實現
- 鴨子模型
設計原則 封裝變化,讓演算法的變化和使用演算法的客戶分離開;多用組合,少用繼承;
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")}