23pattern-go.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. package main
  2. import (
  3. "fmt"
  4. "pattern"
  5. )
  6. func main() {
  7. fmt.Println("--- Démonstration des 23 Patterns GoF ---")
  8. // 1. Singleton
  9. s := pattern.GetInstance()
  10. fmt.Printf("[1] Singleton: %s\n", s)
  11. // 2. Factory Method
  12. dog := pattern.CreateAnimal("dog")
  13. fmt.Printf("[2] Factory Method: Dog says %s\n", dog.Speak())
  14. // 3. Abstract Factory
  15. var factory pattern.GUIFactory = &pattern.WinFactory{}
  16. btn := factory.CreateButton()
  17. fmt.Print("[3] Abstract Factory: ")
  18. btn.Paint()
  19. // 4. Builder
  20. builder := pattern.NewHouseBuilder()
  21. house := builder.SetWindows(4).SetDoors(2).SetRoof("Ardoise").Build()
  22. fmt.Printf("[4] Builder: Maison avec %d fenêtres\n", house.Windows)
  23. // 5. Prototype
  24. proto := &pattern.ConcretePrototype{Name: "Original"}
  25. clone := proto.Clone().(*pattern.ConcretePrototype)
  26. fmt.Printf("[5] Prototype: Clone name is %s\n", clone.Name)
  27. // 6. Adapter
  28. adapter := &pattern.PrinterAdapter{OldPrinter: &pattern.MyLegacyPrinter{}}
  29. fmt.Printf("[6] Adapter: %s\n", adapter.PrintModern("Message"))
  30. // 7. Bridge
  31. red := &pattern.RedCircle{}
  32. circle := pattern.Circle{X: 10, Y: 10, Radius: 5}
  33. circle.SetAPI(red)
  34. fmt.Print("[7] Bridge: ")
  35. circle.Draw()
  36. // 8. Composite
  37. root := &pattern.Composite{}
  38. root.Add(&pattern.Leaf{Name: "Feuille A"})
  39. fmt.Printf("[8] Composite: %s\n", root.Operation())
  40. // 9. Decorator
  41. coffee := &pattern.SimpleCoffee{}
  42. milkCoffee := &pattern.MilkDecorator{Coffee: coffee}
  43. fmt.Printf("[9] Decorator: %s coûte %d\n", milkCoffee.Description(), milkCoffee.Cost())
  44. // 10. Facade
  45. facade := pattern.NewFacade()
  46. fmt.Printf("[10] Facade: %s\n", facade.Operation())
  47. // 11. Flyweight
  48. flyFactory := pattern.NewCharacterFactory()
  49. charA := flyFactory.GetCharacter('A')
  50. fmt.Printf("[11] Flyweight: Character is %c\n", charA.Char)
  51. // 12. Proxy
  52. proxy := &pattern.Proxy{}
  53. fmt.Printf("[12] Proxy: %s\n", proxy.Request())
  54. // 13. Chain of Responsibility
  55. h1 := &pattern.ConcreteHandler1{}
  56. h2 := &pattern.ConcreteHandler2{}
  57. h1.SetNext(h2)
  58. fmt.Printf("[13] Chain: %s\n", h1.Handle("two"))
  59. // 14. Command
  60. light := &pattern.Light{}
  61. cmd := &pattern.LightOnCommand{Light: light}
  62. fmt.Printf("[14] Command: %s\n", cmd.Execute())
  63. // 15. Interpreter
  64. expr := &pattern.TerminalExpression{Data: "Hello"}
  65. fmt.Printf("[15] Interpreter: Is valid? %v\n", expr.Interpret())
  66. // 16. Iterator
  67. coll := &pattern.Collection{Items: []interface{}{1, 2, 3}}
  68. it := coll.CreateIterator()
  69. fmt.Print("[16] Iterator: ")
  70. for it.HasNext() {
  71. fmt.Printf("%v ", it.Next())
  72. }
  73. fmt.Println()
  74. // 17. Mediator
  75. m := &pattern.ConcreteMediator{}
  76. c1 := &pattern.Component1{Mediator: m}
  77. m.SetComponent1(c1)
  78. fmt.Print("[17] Mediator: ")
  79. c1.Trigger()
  80. // 18. Memento
  81. originator := &pattern.Originator{State: "On"}
  82. memento := originator.CreateMemento()
  83. originator.State = "Off"
  84. originator.RestoreMemento(memento)
  85. fmt.Printf("[18] Memento: Restored state: %s\n", originator.State)
  86. // 19. Observer
  87. subject := &pattern.Subject2{}
  88. obs := &pattern.ConcreteObserver{ID: 1}
  89. subject.Attach(obs)
  90. fmt.Print("[19] Observer: ")
  91. subject.SetState("Updated")
  92. // 20. State
  93. ctx := &pattern.Context{State: &pattern.ConcreteStateA{}}
  94. fmt.Printf("[20] State: %s\n", ctx.Request())
  95. // 21. Strategy
  96. contextStrat := &pattern.ContextStrat{Strategy: &pattern.ConcreteStrategyA{}}
  97. fmt.Printf("[21] Strategy: %s\n", contextStrat.Execute())
  98. // 22. Template Method
  99. // En Go, on passe l'implémentation spécifique au "Template"
  100. worker := pattern.NewWorker(&pattern.ConcreteWorker{})
  101. fmt.Printf("[22] Template Method: %s\n", worker.Execute())
  102. // 23. Visitor
  103. element := &pattern.ConcreteElementA{}
  104. visitor := &pattern.ConcreteVisitor{}
  105. fmt.Print("[23] Visitor: ")
  106. element.Accept(visitor)
  107. }