Skip to content

Commit

Permalink
Merge pull request #79 from ilopX/add-facade-pattern
Browse files Browse the repository at this point in the history
Add facade pattern.
  • Loading branch information
ilopX authored Aug 9, 2022
2 parents d35a5c9 + 7857f4c commit 91dfc73
Show file tree
Hide file tree
Showing 13 changed files with 133 additions and 2 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
## 0.38.0
- Add conceptual facade pattern.

## 0.37.0
- Add iterator pattern: Word Iterator.

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ It contains **Dart** examples for all classic **GoF** design patterns.
- [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)]
- [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)]
- [x] **Decorator** - [[Data Source Decoder](https://github.com/RefactoringGuru/design-patterns-dart/tree/main/patterns/decorator/data_source_decoder)]
- [ ] **Facade**
- [ ] **Facade** - [[Conceptual](https://github.com/RefactoringGuru/design-patterns-dart/tree/main/patterns/facade/conceptul)]
- [x] **Flyweight** - [[Conceptual](https://github.com/RefactoringGuru/design-patterns-dart/tree/main/patterns/flyweight/conceptual)]
- [x] **Proxy** - [[Conceptual](https://github.com/RefactoringGuru/design-patterns-dart/tree/main/patterns/proxy/conceptual)]

Expand Down
30 changes: 30 additions & 0 deletions patterns/facade/conceptual/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Facade pattern
Facade is a structural design pattern that provides a simplified interface to a library, a
framework, or any other complex set of classes.

Tutorial: [here](https://refactoring.guru/design-patterns/facade).

### About example.
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)

### Diagram:
![image](https://user-images.githubusercontent.com/8049534/183629745-a62d81be-f640-48e8-b70c-00d6cf59aa5f.png)

### Client code:
```dart
void main() {
final converter = VideoConversionFacade();
final mp4Video = converter.convertVideo("youtubevideo.ogg", "mp4");
// ...;
}
```

### Output:
```
VideoConversionFacade: conversion started.
CodecFactory: extracting ogg audio...
BitrateReader: reading file...
BitrateReader: writing file...
AudioMixer: fixing audio...
VideoConversionFacade: conversion completed.
```
9 changes: 9 additions & 0 deletions patterns/facade/conceptual/main.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// ignore_for_file: unused_local_variable

import 'pattern/video_conversion_facade.dart';

void main() {
final converter = VideoConversionFacade();
final mp4Video = converter.convertVideo("youtubevideo.ogg", "mp4");
// ...;
}
31 changes: 31 additions & 0 deletions patterns/facade/conceptual/pattern/video_conversion_facade.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import 'dart:io';

import '../some_complex_media_library/audio_mixer.dart';
import '../some_complex_media_library/bitrate_reader.dart';
import '../some_complex_media_library/codec.dart';
import '../some_complex_media_library/codec_factory.dart';
import '../some_complex_media_library/mpeg4_compression_codec.dart';
import '../some_complex_media_library/ogg_compression_codec.dart';
import '../some_complex_media_library/video_file.dart';

class VideoConversionFacade {
File convertVideo(String fileName, String format) {
print('VideoConversionFacade: conversion started.');
final file = VideoFile(fileName);
final sourceCodec = CodecFactory.extract(file);
late final Codec destinationCodec;

if (format == "mp4") {
destinationCodec = MPEG4CompressionCodec();
} else {
destinationCodec = OggCompressionCodec();
}

final buffer = BitrateReader.read(file, sourceCodec);
final intermediateResult = BitrateReader.convert(buffer, destinationCodec);
final result = AudioMixer().fix(intermediateResult);
print('VideoConversionFacade: conversion completed.');

return result;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import 'dart:io';

import 'video_file.dart';

class AudioMixer {
File fix(VideoFile result) {
print('AudioMixer: fixing audio...');
return File('tmp');
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import 'codec.dart';
import 'video_file.dart';

class BitrateReader {
static VideoFile read(VideoFile file, Codec codec) {
print('BitrateReader: reading file...');
return file;
}

static VideoFile convert(VideoFile buffer, Codec codec) {
print('BitrateReader: writing file...');
return buffer;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
abstract class Codec {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import 'codec.dart';
import 'mpeg4_compression_codec.dart';
import 'ogg_compression_codec.dart';
import 'video_file.dart';

class CodecFactory {
static Codec extract(VideoFile file) {
String type = file.codecType;
if (type == 'mp4') {
print('CodecFactory: extracting mpeg audio...');
return MPEG4CompressionCodec();
} else {
print('CodecFactory: extracting ogg audio...');
return OggCompressionCodec();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import 'codec.dart';

class MPEG4CompressionCodec implements Codec {
String type = 'mp4';
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import 'codec.dart';

class OggCompressionCodec implements Codec {
final type = 'ogg';
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
class VideoFile {
final String name;
final String codecType;

VideoFile(this.name) : codecType = name.substring(name.indexOf('.') + 1);
}
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: design_patterns_dart
description: Dart examples for all classic GoF design patterns.
version: 0.37.0
version: 0.38.0
homepage: https://refactoring.guru/design-patterns
repository: https://github.com/RefactoringGuru/design-patterns-dart
issue_tracker: https://github.com/RefactoringGuru/design-patterns-dart/issue
Expand Down

0 comments on commit 91dfc73

Please sign in to comment.