Skip to content

Commit 91dfc73

Browse files
authored
Merge pull request #79 from ilopX/add-facade-pattern
Add facade pattern.
2 parents d35a5c9 + 7857f4c commit 91dfc73

13 files changed

+133
-2
lines changed

CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
## 0.38.0
2+
- Add conceptual facade pattern.
3+
14
## 0.37.0
25
- Add iterator pattern: Word Iterator.
36

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ It contains **Dart** examples for all classic **GoF** design patterns.
2626
- [x] **Bridge** - [[Remote Device Control](https://github.com/RefactoringGuru/design-patterns-dart/tree/main/patterns/bridge/devices_remote_control)] [[Clock](https://github.com/RefactoringGuru/design-patterns-dart/tree/main/patterns/bridge/clock)]
2727
- [x] **Composite** - [[Image Editor](https://github.com/RefactoringGuru/design-patterns-dart/tree/main/patterns/composite/image_editor)] [[Products and Boxes](https://github.com/RefactoringGuru/design-patterns-dart/tree/main/patterns/composite/products_and_boxes)]
2828
- [x] **Decorator** - [[Data Source Decoder](https://github.com/RefactoringGuru/design-patterns-dart/tree/main/patterns/decorator/data_source_decoder)]
29-
- [ ] **Facade**
29+
- [ ] **Facade** - [[Conceptual](https://github.com/RefactoringGuru/design-patterns-dart/tree/main/patterns/facade/conceptul)]
3030
- [x] **Flyweight** - [[Conceptual](https://github.com/RefactoringGuru/design-patterns-dart/tree/main/patterns/flyweight/conceptual)]
3131
- [x] **Proxy** - [[Conceptual](https://github.com/RefactoringGuru/design-patterns-dart/tree/main/patterns/proxy/conceptual)]
3232

patterns/facade/conceptual/README.md

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# Facade pattern
2+
Facade is a structural design pattern that provides a simplified interface to a library, a
3+
framework, or any other complex set of classes.
4+
5+
Tutorial: [here](https://refactoring.guru/design-patterns/facade).
6+
7+
### About example.
8+
This the very conceptual example rewrite from original source code [java example](https://github.com/RefactoringGuru/design-patterns-java/tree/main/src/refactoring_guru/facade/example)
9+
10+
### Diagram:
11+
![image](https://user-images.githubusercontent.com/8049534/183629745-a62d81be-f640-48e8-b70c-00d6cf59aa5f.png)
12+
13+
### Client code:
14+
```dart
15+
void main() {
16+
final converter = VideoConversionFacade();
17+
final mp4Video = converter.convertVideo("youtubevideo.ogg", "mp4");
18+
// ...;
19+
}
20+
```
21+
22+
### Output:
23+
```
24+
VideoConversionFacade: conversion started.
25+
CodecFactory: extracting ogg audio...
26+
BitrateReader: reading file...
27+
BitrateReader: writing file...
28+
AudioMixer: fixing audio...
29+
VideoConversionFacade: conversion completed.
30+
```

patterns/facade/conceptual/main.dart

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// ignore_for_file: unused_local_variable
2+
3+
import 'pattern/video_conversion_facade.dart';
4+
5+
void main() {
6+
final converter = VideoConversionFacade();
7+
final mp4Video = converter.convertVideo("youtubevideo.ogg", "mp4");
8+
// ...;
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import 'dart:io';
2+
3+
import '../some_complex_media_library/audio_mixer.dart';
4+
import '../some_complex_media_library/bitrate_reader.dart';
5+
import '../some_complex_media_library/codec.dart';
6+
import '../some_complex_media_library/codec_factory.dart';
7+
import '../some_complex_media_library/mpeg4_compression_codec.dart';
8+
import '../some_complex_media_library/ogg_compression_codec.dart';
9+
import '../some_complex_media_library/video_file.dart';
10+
11+
class VideoConversionFacade {
12+
File convertVideo(String fileName, String format) {
13+
print('VideoConversionFacade: conversion started.');
14+
final file = VideoFile(fileName);
15+
final sourceCodec = CodecFactory.extract(file);
16+
late final Codec destinationCodec;
17+
18+
if (format == "mp4") {
19+
destinationCodec = MPEG4CompressionCodec();
20+
} else {
21+
destinationCodec = OggCompressionCodec();
22+
}
23+
24+
final buffer = BitrateReader.read(file, sourceCodec);
25+
final intermediateResult = BitrateReader.convert(buffer, destinationCodec);
26+
final result = AudioMixer().fix(intermediateResult);
27+
print('VideoConversionFacade: conversion completed.');
28+
29+
return result;
30+
}
31+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import 'dart:io';
2+
3+
import 'video_file.dart';
4+
5+
class AudioMixer {
6+
File fix(VideoFile result) {
7+
print('AudioMixer: fixing audio...');
8+
return File('tmp');
9+
}
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import 'codec.dart';
2+
import 'video_file.dart';
3+
4+
class BitrateReader {
5+
static VideoFile read(VideoFile file, Codec codec) {
6+
print('BitrateReader: reading file...');
7+
return file;
8+
}
9+
10+
static VideoFile convert(VideoFile buffer, Codec codec) {
11+
print('BitrateReader: writing file...');
12+
return buffer;
13+
}
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
abstract class Codec {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import 'codec.dart';
2+
import 'mpeg4_compression_codec.dart';
3+
import 'ogg_compression_codec.dart';
4+
import 'video_file.dart';
5+
6+
class CodecFactory {
7+
static Codec extract(VideoFile file) {
8+
String type = file.codecType;
9+
if (type == 'mp4') {
10+
print('CodecFactory: extracting mpeg audio...');
11+
return MPEG4CompressionCodec();
12+
} else {
13+
print('CodecFactory: extracting ogg audio...');
14+
return OggCompressionCodec();
15+
}
16+
}
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import 'codec.dart';
2+
3+
class MPEG4CompressionCodec implements Codec {
4+
String type = 'mp4';
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import 'codec.dart';
2+
3+
class OggCompressionCodec implements Codec {
4+
final type = 'ogg';
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
class VideoFile {
2+
final String name;
3+
final String codecType;
4+
5+
VideoFile(this.name) : codecType = name.substring(name.indexOf('.') + 1);
6+
}

pubspec.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: design_patterns_dart
22
description: Dart examples for all classic GoF design patterns.
3-
version: 0.37.0
3+
version: 0.38.0
44
homepage: https://refactoring.guru/design-patterns
55
repository: https://github.com/RefactoringGuru/design-patterns-dart
66
issue_tracker: https://github.com/RefactoringGuru/design-patterns-dart/issue

0 commit comments

Comments
 (0)