-
Notifications
You must be signed in to change notification settings - Fork 0
/
Program.cs
185 lines (134 loc) · 5.54 KB
/
Program.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
using Patterns.BehavioralPatterns;
using Patterns.BehavioralPatterns.ObserverDispatcherPattern;
using Patterns.BehavioralPatterns.StatePattern;
using Patterns.BuilderPattern;
using Patterns.CreationalPatterns.PrototypePattern;
using Patterns.CriteriaPattern;
using Patterns.FactoryPattern;
using Patterns.SingletonPattern;
using Patterns.StructuralPatterns.AdapterPattern;
using Patterns.StructuralPatterns.BridgePattern;
using Patterns.StructuralPatterns.DecoratorPattern;
using System;
using System.Collections.Generic;
using System.Linq;
using Shape = Patterns.StructuralPatterns.DecoratorPattern.Shape;
public class Program
{
public static void Main()
{
#region Creational Patterns)
//FactoryPatternDemo();
//SingletonPatternDemo();
//BuilderPatternDemo();
//PrototypePatternDemo();
#endregion
#region Structural Patterns
//AdapterPatternDemo();
//BridgePatternDemo();
//DecoratorPatternDemo();
//CriteriaPatternDemo();
#endregion
#region Behavioral Patterns
//ChainOfResponsibilityDemo();
//StatePatternDemo();
//ObserverDispatcherPatternDemo();
#endregion
Console.ReadKey();
}
public static void CriteriaPatternDemo() {
Person p1 = new Person("Aykut", 24, Gender.MALE);
Person p2 = new Person("Yilmaz", 55, Gender.MALE);
Person p3 = new Person("Esra", 50, Gender.FEMALE);
Person p4 = new Person("Zeynep", 12, Gender.FEMALE);
List<Person> family = new List<Person>() { p1, p2, p3, p4 };
ICriteria<Person> maleCriteria = new MaleCriteria();
ICriteria<Person> femaleCriteria = new FemaleCriteria();
ICriteria<Person> teenCriteria = new TeenCriteria();
var males = maleCriteria.Filter(family).ToList();
var females = femaleCriteria.Filter(family).ToList();
var teens = teenCriteria.Filter(family).ToList();
ICriteria<Person> maleAndTeenCriteria = new AndCriteria(maleCriteria, teenCriteria);
var teenMales = maleAndTeenCriteria.Filter(family);
ICriteria<Person> femaleAndTeenCriteria = new AndCriteria(femaleCriteria, teenCriteria);
var teenFemales = femaleAndTeenCriteria.Filter(family);
ICriteria<Person> maleOrTeenCriteria = new OrCriteria(maleCriteria, teenCriteria);
var malesOrTeens = maleOrTeenCriteria.Filter(family);
}
public static void FactoryPatternDemo() {
CarFactory carFactory = new CarFactory();
Car redBugatti = carFactory.GetCar("Bugatti", Color.RED);
Car pinkPorche = carFactory.GetCar("Porche", Color.PINK);
}
public static void SingletonPatternDemo()
{
DeviceManager manager1 = DeviceManager.GetInstance();
DeviceManager manager2 = DeviceManager.GetInstance();
Console.WriteLine(manager1.GetHashCode());
Console.WriteLine(manager2.GetHashCode());
}
public static void BuilderPatternDemo() {
HttpRequest.HttpRequestBuilder httpRequestBuilder = new HttpRequest.HttpRequestBuilder("https://www.google.com");
HttpRequest httpRequest = httpRequestBuilder.SetFilter("q=stuff")
.SetOrdering("datetime desc")
.SetSkip(25)
.SetTop(25)
.Build();
}
public static void PrototypePatternDemo()
{
ICache<Customer> customerCache = new CustomerCache();
Customer c1 = customerCache.GetFromCache(1);
Customer c2 = customerCache.GetFromCache(1);
}
public static void AdapterPatternDemo() {
MediaAdapter mediAdapter = new MediaAdapter();
mediAdapter.play("VLC","song1.vlc");
mediAdapter.play("MP3", "song2.mp3");
mediAdapter.play("MP4", "song3.mp4");
}
public static void BridgePatternDemo() {
// complex drawing responsibility is left to DrawAPI
DrawAPI drawAPI = new DrawAPI();
Patterns.StructuralPatterns.BridgePattern.Shape shape1 = new Patterns.StructuralPatterns.BridgePattern.Circle(drawAPI);
shape1.drawCircle();
Patterns.StructuralPatterns.BridgePattern.Shape shape2 = new Patterns.StructuralPatterns.BridgePattern.Rectangle(drawAPI);
shape2.drawRectangle();
}
public static void DecoratorPatternDemo() {
// when we want to decorate some class, we donot make any changes on the class, instead we use decorator interface to decorate the class
Patterns.StructuralPatterns.DecoratorPattern.Shape circle = new Patterns.StructuralPatterns.DecoratorPattern.Circle();
Patterns.StructuralPatterns.DecoratorPattern.ShapeDecorator shapeDecorator = new RedShapeDecorator(circle);
shapeDecorator.Draw();
}
public static void ChainOfResponsibilityPatternDemo() {
Func<AbstractLogger> getLoggerChain = () =>
{
AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
AbstractLogger debugLogger = new DebugLogger(AbstractLogger.DEBUG);
AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.INFO);
errorLogger.NextLogger = debugLogger;
debugLogger.NextLogger = consoleLogger;
return errorLogger;
};
getLoggerChain().LogMessage(AbstractLogger.DEBUG, "Hello World!");
}
public static void StatePatternDemo() {
// we can think of it as finite state machine
State startState = new StartState();
State stopState = new StopState();
Context context = new Context();
startState.DoAction(context);
stopState.DoAction(context);
}
public static void ObserverDispatcherPatternDemo() {
AbstractDispatcher sumDispatcher = new SumDispatcher();
sumDispatcher.Dispatch(new SumEvent(20.3,12.4)); // no observer attached to dispatcher
IObserver intSumObserver = new IntSumObserver();
sumDispatcher.Attach(intSumObserver);
sumDispatcher.Dispatch(new SumEvent(11.3, 11.2)); // one observer attached to dispatcher
IObserver doubleSumObserver = new DoubleSumObserver();
sumDispatcher.Attach(doubleSumObserver);
sumDispatcher.Dispatch(new SumEvent(-20.3, 9.8)); // two observers attached to dispatcher
}
}