设计模式_观察者_Go
Observer模式 在Observer模式中,当观察对象的状态发生变化时,会通知给观察者。Observer模式适用于根据对象状态进行相应处理的场景。
实例NumberGenerator接口1234567type NumberGenerator interface { AddObserver(Observer) DeleteObserver(Observer) NotifyObservers() GetNumber() int Execute()}
Observer接口123type Observer interface { Update(NumberGenerator)}
DigitObserver结构体1234567type DigitObserver struct {}func (do DigitObserver) Update(generator _interface.NumberGenerator) { fmt.Println("DigitObserver: ...
设计模式_仲裁模式_Go
Mediator模式 Mediator的意思是”仲裁者“”中介者“。一方面发生麻烦事的时候,会通知仲裁者;当发生涉及全部组员的事情时,也通知仲裁者。当仲裁者下达指示时,组员会立即执行。团队组员之间不再互相沟通私自做出决定,而是发生任何事情都向仲裁者报告。另一方面,仲裁者站在整个团队的角度上对组员上报的事做出决定。
实例Colleague123456789101112131415161718192021222324252627type Country interface { SendMessage(message string) GetMessage(message string)}type USA struct { UnitedNations}func (usa USA) SendMessage(message string) { usa.UnitedNations.ForwardMessage(message, usa)}func (usa USA) GetMessage(message string ...
设计模式_窗口模式_Go
Facade模式 程序这东西总会越来越大。随着时间的推移,程序中的类越来越多,而且他们之间相互关联,这会导致程序的结构也越来越复杂。我们在使用这些类之前,必须先弄清楚他们之间的关系,注意正确的调用顺序。
特别是处理大型程序时,我们需要格外注意那些数量庞大的类之间的错综复杂的关系。不过与其这么做,不如为这个大型程序准备一个”窗口“。这样,我们就不必单独的关注每个类了。
使用Facade模式可以为相互关联在一起的类整理出高层接口(API)。其中的Facade角色可以让系统只有一个简单的接口(API)。而且,Facade角色还会考虑到系统内部的各个类的依赖关系和责任关系,按照正确的顺序调用各个类。
实例模拟数据 database.txt123zhangsan@qq.com=Zhang Sanlisi@qq.com=Li Siwangwu@qq.com=Wang Wu
Database结构体123456789101112131415161718192021222324252627type database struct {}func (d da ...
设计模式_职责链_Go
ChainOfResponsibility模式 我们先看看什么是推卸责任。假设我们要去公司领取资料。首先我们要向公司前台打听要去哪里领资料,他告诉我们应该去“营业窗口”。等我们到了”营业窗口“后,又被告知去“售后部门”。等我们好不容易到了“售后部门”时,又被告知应该去“资料中心”。像这样,在找到合适的办事人之前,我们被不断地踢给一个又一个人,这就是“推卸责任”。
“推卸责任”听起来有些贬义,但有时候确实需要“推卸责任”的情况。例如,当外部请求程序进行某个处理,但程序暂时无法直接决定由那个对象处理时,就需要责任链模式。这种情况下,我们可以考虑将多个对象组成一条职责链,然后按照他们在职责链上的顺序一个一个的找出来由谁负责。
实例Support接口1234567type Support interface { SetNext(Support) Support GetNext() Support GetName() string Resolve(Trouble) bool Support(Trouble)}
Trouble接口1234 ...
设计模式_访问者_Go
Visitor模式 在Visitor模式中,数据结构和处理被分离开来。我们需要编写一个“访问者”类来访问数据结构中的元素,并把对个元素处理交给访问者类。这样,当需要增加新的处理时,我们只需要编写新的访问者,然后让数据结构可以接受访问者的访问即可。
实例Element接口123type Element interface { Accept(Visitor)}
Entry接口12345type Entry interface { GetName() string GetSize() int Element}
File接口123type File interface { Entry}
Directory接口12345type Directory interface { Entry Add(Entry) GetRange() []Entry}
Visitor接口1234type Visitor interface { VisitFile(File) Vi ...
设计模式_装饰模式_Go
Decorator模式 假如现在有一块蛋糕,如果只涂上奶油,其他什么都不做,就是奶油蛋糕。如果加上草莓,就是草莓奶油蛋糕。如果再加上一块黑色巧克力板,上面用白色巧克力写上姓名,然后插上代表年龄的蜡烛,就变成了一块生日蛋糕。
不论是蛋糕、奶油蛋糕、草莓蛋糕还是生日蛋糕,他们的核心都是蛋糕。不过,经过涂上奶油、加上草莓等装饰后,蛋糕的味道变得更加甜美了,目的更加明确了。
程序中的对象与蛋糕十分相似。首先有一个相当于蛋糕的对象,然后像不断地装饰蛋糕一样地添加对应功能,它就变成使用目的更加明确的对象。
像这样不断地为对象添加装饰的设计模式被称为Decorator模式。Decorator指的是“装饰物”。
实例Display接口123456789type Display interface { GetColumns() int GetRows() int GetRowText(int) string}type Show interface { Show(Display)}
StringDisplay结 ...
设计模式_混合模式_Go
Composite模式 在计算机的文件系统中,有“文件夹”的概念。文件夹里面既可以放入文件,也可以放入其他文件夹(子文件夹)。在子文件夹中,一样地即可以放入文件,又可以放入文件夹。可以说,文件夹是形成了一种容器结构、递归结构。
虽然文件夹与文件是不同类型的对象,但他们都“可以被放入文件夹中”。文件夹和文件有时也被统称为“目录条目”。在目录条目中,文件夹和文件被当作同一种对象看待。
将容器和内容作为同一种东西看待,帮助我们方便处理问题。在容器中即可以放入内容,也可以放入小容器,小容器中可以放入更小的容器。这样,就形成了容器结构、递归结构。能够使容器和内容具有一致性,创造出递归结构的模式就是Composite模式。
实例Entry接口12345type Entry interface { GetName() string GetSize() int PrintList(string)}
Entry.go123func EntryToString(e _interface.Entry) string { return ...
设计模式_策略模式_Go
Strategy模式无论什么程序,其目的都是解决问题。而为了解决问题,我们又需要编写特定算法。使用Strategy模式可以整体地替换算法的实现部分。能够整体地替换算法,能够让我们轻松地以不同方法解决同一个问题,这种模式就是Strategy模式。
实例Strategy接口1234type Strategy interface { NextHand() Hand Study(bool)}
Hand接口12345type Hand interface { IsStrongerThan(Hand) bool IsWeakerThan(Hand) bool GetHandValue() int}
Hand.go12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152const ( HandValueGUU = iota // 石头 HandValueCHO // 布 Hand ...
设计模式_桥接模式_Go
Bridge模式“Birdge”的意思是桥梁。就像现实世界中,桥梁的意思是将河流两侧连接起来一样,Bridge模式的作用也是将两种东西连接起来:
类的功能层次结构
类的实现结构
类的层次结构的两种作用希望新增功能时假设现在有一个类Something。当我们想在Something中增加新功能时(想增加一个具体方法时),会编写一个Something的子类(派生类),即SomethingGood类。这样就构成了一个小小的类层次结构。
父类具有基本功能
子类中新增功能
以上这种层次结构被称为”类的功能层次结构“
注意: 通常来说,类的层次结构关系不应过深
希望增加新的实现时父类声明接口,而子类的任务是实现接口。正是由于父类和子类的这种任务分担,我们才可以编写出高可替换性的类。
当子类ConcreteClass实现了父类AbstractClass类的接口时,他们之间就构成了一个小小的层次结构。
这种层次结构并非用于方便我们新增方法,他真正的作用时帮助我们实现下面的任务分组:
父类声明接口
子类实现接口
这种层次结构被称为”类的实现层次结构“
类的层次结构的混杂与分离 当我们编 ...
设计模式_抽象工厂_Go
AbstractFactory抽象工厂的工作是将”抽象零件“组装成”抽象产品“
我们无需关心零件的具体实现,而是只关心接口。仅使用接口将零件组装为产品。
实例仅包含关键代码
具体代码在Github上查看
Factory接口12345type Factory interface { CreateLink(string, string) Link CreateTray(string) Tray CreatePage(string, string) Page}
Item接口123type Item interface { MakeHtml() string}
Factory方法1234567891011func GetFactory(way string) _interface.Factory { switch way { case "list": return list.Factory{} case "table": r ...