-
Notifications
You must be signed in to change notification settings - Fork 21
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
61bb0d1
commit 6a1d34c
Showing
29 changed files
with
1,665 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
# Compiled Object files, Static and Dynamic libs (Shared Objects) | ||
*.o | ||
*.a | ||
*.so | ||
|
||
# Folders | ||
_obj | ||
_test | ||
|
||
# Architecture specific extensions/prefixes | ||
*.[568vq] | ||
[568vq].out | ||
|
||
*.cgo1.go | ||
*.cgo2.c | ||
_cgo_defun.c | ||
_cgo_gotypes.go | ||
_cgo_export.* | ||
|
||
_testmain.go | ||
|
||
*.prof | ||
# Test binary, build with `go test -c` | ||
*.test | ||
# Binaries for programs and plugins | ||
*.exe | ||
*.dll | ||
*.dylib | ||
|
||
# JetBrains project files | ||
.idea/ | ||
|
||
# Output of the go coverage tool, specifically when used with LiteIDE | ||
*.out |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
language: node_js | ||
|
||
env: | ||
global: | ||
- GH_REPO="github.com/tmrts/go-patterns" | ||
- secure: SRAVBGLCkoVpCNC5J43qC6xcQvigIYbGKgLMLiP9B4XiyKH/Q6VGjk/BVVPYuC0d072jNjgfhVdTLx/jGgy6nN+AD7i8U/FoDY6pQmy4cK1nghUUlt44mq7JTlXYHLmV3NsaxmRMV5QuO9L/9AMcCh6U0MxrgMYafSPaSdHQq8hTkFFOYU05zKKUihLF3sVfEZ0KpxhHjtKA+SqcJK2NjqaGdySaziSe6Nj1kZgF9/SJkOiw/bM7O4/uqFXqEGZo5QaOQpwaj2B0wfGqwfJtyE2wM+80Aw5Ya/yqdQWplUozHKv36/u1N45cHkeDbr+RXnBpmUfGh8YTbInWh9BjyU5MLgKeJTtUMAVvwr/soa+OsHuGmdeVM5mRdXISlFSnXCkoowJ6iQsPdqGvYROz0KqqXmkVDuUKdxPU4ShyKo/LqtRwXvxQS9etF4ais8MoNmW0zI3eKdc4b6cpCXWt5fUtK8uzSUGDHHVFGpWnk8VsF0cPfLYxd9bo87amHqYGQoPJ4ughTtOAbA6uSNlcDM9AkQ591+vHpQE15td2VXUOf7aKqqPFWy+GagsI/yPry6v3d/Mk5D4ZLUXZGOv5uvengyos0dxWg9EV1yjm/mpiCtuqAtvV9HMNxcMGGCii7dMy37WmGBj3HBqeGPYHvt8pKMo2/gkcXxadzBXvJVs= | ||
|
||
install: | ||
- npm install gitbook-cli | ||
- gitbook install | ||
|
||
script: | ||
- gitbook build . out | ||
|
||
after_success: | ||
- echo -e "Deploying updates to GitHub..." | ||
- MSG=$(git log -1 --oneline) | ||
- cd out | ||
- git config --global user.email "contact@tmrts.com" | ||
- git config --global user.name "Tamer Tas" | ||
- git init | ||
- git checkout -b gh-pages | ||
- git add -A :/ | ||
- git commit -m "Travis CI | ${MSG}" | ||
- git push "https://${GH_TOKEN}@${GH_REPO}" gh-pages -f |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
# Contribution Guidelines | ||
|
||
Please ensure your pull request adheres to the following guidelines: | ||
|
||
- Make an individual pull request for each suggestion. | ||
- Choose the corresponding patterns section for your suggestion. | ||
- List, after your addition, should be in lexicographical order. | ||
|
||
## Commit Messages Guidelines | ||
|
||
- The message should be in imperative form and uncapitalized. | ||
- If possible, please include an explanation in the commit message body | ||
- Use the form `<pattern-section>/<pattern-name>: <message>` (e.g. `creational/singleton: refactor singleton constructor`) | ||
|
||
## Pattern Template | ||
|
||
Each pattern should have a single markdown file containing the important part of the implementation, the usage and the explanations for it. This is to ensure that the reader doesn't have to read bunch of boilerplate to understand what's going on and the code is as simple as possible and not simpler. | ||
|
||
Please use the following template for adding new patterns: | ||
|
||
```markdown | ||
# <Pattern-Name> | ||
<Pattern description> | ||
|
||
## Implementation | ||
|
||
## Usage | ||
|
||
// Optional | ||
## Rules of Thumb | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,110 @@ | ||
<p align="center"> | ||
<img src="/gopher.png" height="400"> | ||
<h1 align="center"> | ||
Go Patterns | ||
<br> | ||
<a href="http://travis-ci.org/tmrts/go-patterns"><img alt="build-status" src="https://img.shields.io/badge/build-passing-brightgreen.svg?style=flat-square" /></a> | ||
<a href="https://github.com/sindresorhus/awesome" ><img alt="awesome" src="https://img.shields.io/badge/awesome-%E2%9C%93-ff69b4.svg?style=flat-square" /></a> | ||
<a href="https://github.com/tmrts/go-patterns/blob/master/LICENSE" ><img alt="license" src="https://img.shields.io/badge/license-Apache%20License%202.0-E91E63.svg?style=flat-square" /></a> | ||
</h1> | ||
</p> | ||
|
||
A curated collection of idiomatic design & application patterns for Go language. | ||
|
||
## Creational Patterns | ||
|
||
| Pattern | Description | Status | | ||
|:-------:|:----------- |:------:| | ||
| [Abstract Factory](/creational/abstract_factory.md) | Provides an interface for creating families of releated objects | ✘ | | ||
| [Builder](/creational/builder.md) | Builds a complex object using simple objects | ✔ | | ||
| [Factory Method](/creational/factory.md) | Defers instantiation of an object to a specialized function for creating instances | ✔ | | ||
| [Object Pool](/creational/object-pool.md) | Instantiates and maintains a group of objects instances of the same type | ✔ | | ||
| [Singleton](/creational/singleton.md) | Restricts instantiation of a type to one object | ✔ | | ||
|
||
## Structural Patterns | ||
|
||
| Pattern | Description | Status | | ||
|:-------:|:----------- |:------:| | ||
| [Bridge](/structural/bridge.md) | Decouples an interface from its implementation so that the two can vary independently | ✘ | | ||
| [Composite](/structural/composite.md) | Encapsulates and provides access to a number of different objects | ✘ | | ||
| [Decorator](/structural/decorator.md) | Adds behavior to an object, statically or dynamically | ✔ | | ||
| [Facade](/structural/facade.md) | Uses one type as an API to a number of others | ✘ | | ||
| [Flyweight](/structural/flyweight.md) | Reuses existing instances of objects with similar/identical state to minimize resource usage | ✘ | | ||
| [Proxy](/structural/proxy.md) | Provides a surrogate for an object to control it's actions | ✔ | | ||
|
||
## Behavioral Patterns | ||
|
||
| Pattern | Description | Status | | ||
|:-------:|:----------- |:------:| | ||
| [Chain of Responsibility](/behavioral/chain_of_responsibility.md) | Avoids coupling a sender to receiver by giving more than object a chance to handle the request | ✘ | | ||
| [Command](/behavioral/command.md) | Bundles a command and arguments to call later | ✘ | | ||
| [Mediator](/behavioral/mediator.md) | Connects objects and acts as a proxy | ✘ | | ||
| [Memento](/behavioral/memento.md) | Generate an opaque token that can be used to go back to a previous state | ✘ | | ||
| [Observer](/behavioral/observer.md) | Provide a callback for notification of events/changes to data | ✔ | | ||
| [Registry](/behavioral/registry.md) | Keep track of all subclasses of a given class | ✘ | | ||
| [State](/behavioral/state.md) | Encapsulates varying behavior for the same object based on its internal state | ✘ | | ||
| [Strategy](/behavioral/strategy.md) | Enables an algorithm's behavior to be selected at runtime | ✔ | | ||
| [Template](/behavioral/template.md) | Defines a skeleton class which defers some methods to subclasses | ✘ | | ||
| [Visitor](/behavioral/visitor.md) | Separates an algorithm from an object on which it operates | ✘ | | ||
|
||
## Synchronization Patterns | ||
|
||
| Pattern | Description | Status | | ||
|:-------:|:----------- |:------:| | ||
| [Condition Variable](/synchronization/condition_variable.md) | Provides a mechanism for threads to temporarily give up access in order to wait for some condition | ✘ | | ||
| [Lock/Mutex](/synchronization/mutex.md) | Enforces mutual exclusion limit on a resource to gain exclusive access | ✘ | | ||
| [Monitor](/synchronization/monitor.md) | Combination of mutex and condition variable patterns | ✘ | | ||
| [Read-Write Lock](/synchronization/read_write_lock.md) | Allows parallel read access, but only exclusive access on write operations to a resource | ✘ | | ||
| [Semaphore](/synchronization/semaphore.md) | Allows controlling access to a common resource | ✔ | | ||
|
||
## Concurrency Patterns | ||
|
||
| Pattern | Description | Status | | ||
|:-------:|:----------- |:------:| | ||
| [N-Barrier](/concurrency/barrier.md) | Prevents a process from proceeding until all N processes reach to the barrier | ✘ | | ||
| [Bounded Parallelism](/concurrency/bounded_parallelism.md) | Completes large number of independent tasks with resource limits | ✔ | | ||
| [Broadcast](/concurrency/broadcast.md) | Transfers a message to all recipients simultaneously | ✘ | | ||
| [Coroutines](/concurrency/coroutine.md) | Subroutines that allow suspending and resuming execution at certain locations | ✘ | | ||
| [Generators](/concurrency/generator.md) | Yields a sequence of values one at a time | ✔ | | ||
| [Reactor](/concurrency/reactor.md) | Demultiplexes service requests delivered concurrently to a service handler and dispatches them syncronously to the associated request handlers | ✘ | | ||
| [Parallelism](/concurrency/parallelism.md) | Completes large number of independent tasks | ✔ | | ||
| [Producer Consumer](/concurrency/producer_consumer.md) | Separates tasks from task executions | ✘ | | ||
|
||
## Messaging Patterns | ||
|
||
| Pattern | Description | Status | | ||
|:-------:|:----------- |:------:| | ||
| [Fan-In](/messaging/fan_in.md) | Funnels tasks to a work sink (e.g. server) | ✔ | | ||
| [Fan-Out](/messaging/fan_out.md) | Distributes tasks among workers (e.g. producer) | ✔ | | ||
| [Futures & Promises](/messaging/futures_promises.md) | Acts as a place-holder of a result that is initially unknown for synchronization purposes | ✘ | | ||
| [Publish/Subscribe](/messaging/publish_subscribe.md) | Passes information to a collection of recipients who subscribed to a topic | ✔ | | ||
| [Push & Pull](/messaging/push_pull.md) | Distributes messages to multiple workers, arranged in a pipeline | ✘ | | ||
|
||
## Stability Patterns | ||
|
||
| Pattern | Description | Status | | ||
|:-------:|:----------- |:------:| | ||
| [Bulkheads](/stability/bulkhead.md) | Enforces a principle of failure containment (i.e. prevents cascading failures) | ✘ | | ||
| [Circuit-Breaker](/stability/circuit-breaker.md) | Stops the flow of the requests when requests are likely to fail | ✔ | | ||
| [Deadline](/stability/deadline.md) | Allows clients to stop waiting for a response once the probability of response becomes low (e.g. after waiting 10 seconds for a page refresh) | ✘ | | ||
| [Fail-Fast](/stability/fail_fast.md) | Checks the availability of required resources at the start of a request and fails if the requirements are not satisfied | ✘ | | ||
| [Handshaking](/stability/handshaking.md) | Asks a component if it can take any more load, if it can't, the request is declined | ✘ | | ||
| [Steady-State](/stability/steady_state.md) | For every service that accumulates a resource, some other service must recycle that resource | ✘ | | ||
|
||
## Profiling Patterns | ||
|
||
| Pattern | Description | Status | | ||
|:-------:|:----------- |:------:| | ||
| [Timing Functions](/profiling/timing.md) | Wraps a function and logs the execution | ✔ | | ||
|
||
## Idioms | ||
|
||
| Pattern | Description | Status | | ||
|:-------:|:----------- |:------:| | ||
| [Functional Options](/idiom/functional-options.md) | Allows creating clean APIs with sane defaults and idiomatic overrides | ✔ | | ||
|
||
## Anti-Patterns | ||
|
||
| Pattern | Description | Status | | ||
|:-------:|:----------- |:------:| | ||
| [Cascading Failures](/anti-patterns/cascading_failures.md) | A failure in a system of interconnected parts in which the failure of a part causes a domino effect | ✘ | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
# Summary | ||
|
||
* [Go Patterns](/README.md) | ||
* [Creational Patterns](/README.md#creational-patterns) | ||
* [Abstract Factory](/creational/abstract_factory.md) | ||
* [Builder](/creational/builder.md) | ||
* [Factory Method](/creational/factory.md) | ||
* [Object Pool](/creational/object-pool.md) | ||
* [Singleton](/creational/singleton.md) | ||
* [Structural Patterns](/README.md#structural-patterns) | ||
* [Bridge](/structural/bridge.md) | ||
* [Composite](/structural/composite.md) | ||
* [Decorator](/structural/decorator.md) | ||
* [Facade](/structural/facade.md) | ||
* [Flyweight](/structural/flyweight.md) | ||
* [Proxy](/structural/proxy.md) | ||
* [Behavioral Patterns](/README.md#behavioral-patterns) | ||
* [Chain of Responsibility](/behavioral/chain_of_responsibility.md) | ||
* [Command](/behavioral/command.md) | ||
* [Mediator](/behavioral/mediator.md) | ||
* [Memento](/behavioral/memento.md) | ||
* [Observer](/behavioral/observer.md) | ||
* [Registry](/behavioral/registry.md) | ||
* [State](/behavioral/state.md) | ||
* [Strategy](/behavioral/strategy.md) | ||
* [Template](/behavioral/template.md) | ||
* [Visitor](/behavioral/visitor.md) | ||
* [Synchronization Patterns](/README.md#synchronization-patterns) | ||
* [Condition Variable](/synchronization/condition_variable.md) | ||
* [Lock/Mutex](/synchronization/mutex.md) | ||
* [Monitor](/synchronization/monitor.md) | ||
* [Read-Write Lock](/synchronization/read_write_lock.md) | ||
* [Semaphore](/synchronization/semaphore.md) | ||
* [Concurrency Patterns](/README.md#concurrency-patterns) | ||
* [N-Barrier](/concurrency/barrier.md) | ||
* [Bounded Parallelism](/concurrency/bounded_parallelism.md) | ||
* [Broadcast](/concurrency/broadcast.md) | ||
* [Coroutines](/concurrency/coroutine.md) | ||
* [Generators](/concurrency/generator.md) | ||
* [Reactor](/concurrency/reactor.md) | ||
* [Parallelism](/concurrency/parallelism.md) | ||
* [Producer Consumer](/concurrency/producer_consumer.md) | ||
* [Messaging Patterns](/README.md#messaging-patterns) | ||
* [Fan-In](/messaging/fan_in.md) | ||
* [Fan-Out](/messaging/fan_out.md) | ||
* [Futures & Promises](/messaging/futures_promises.md) | ||
* [Publish/Subscribe](/messaging/publish_subscribe.md) | ||
* [Push & Pull](/messaging/push_pull.md) | ||
* [Stability Patterns](/README.md#stability-patterns) | ||
* [Bulkheads](/stability/bulkhead.md) | ||
* [Circuit-Breaker](/stability/circuit-breaker.md) | ||
* [Deadline](/stability/deadline.md) | ||
* [Fail-Fast](/stability/fail_fast.md) | ||
* [Handshaking](/stability/handshaking.md) | ||
* [Steady-State](/stability/steady_state.md) | ||
* [Profiling Patterns](/README.md#profiling-patterns) | ||
* [Timing Functions](/profiling/timing.md) | ||
* [Idioms](/README.md#idioms) | ||
* [Functional Options](/idiom/functional-options.md) | ||
* [Anti-Patterns](/README.md#anti-patterns) | ||
* [Cascading Failures](/anti-patterns/cascading_failures.md) | ||
* [Contributing](/CONTRIBUTING.md) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
{ | ||
"plugins": [ | ||
"-search", | ||
"-lunr", | ||
"github", | ||
"edit-link" | ||
], | ||
"pluginsConfig": { | ||
"github": { | ||
"url": "https://github.com/tmrts/go-patterns" | ||
}, | ||
"edit-link": { | ||
"base": "https://github.com/tmrts/go-patterns/edit/master/", | ||
"label": "" | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
# Observer Pattern | ||
|
||
The [observer pattern](https://en.wikipedia.org/wiki/Observer_pattern) allows a type instance to "publish" events to other type instances ("observers") who wish to be updated when a particular event occurs. | ||
|
||
## Implementation | ||
|
||
In long-running applications—such as webservers—instances can keep a collection of observers that will receive notification of triggered events. | ||
|
||
Implementations vary, but interfaces can be used to make standard observers and notifiers: | ||
|
||
```go | ||
type ( | ||
// Event defines an indication of a point-in-time occurrence. | ||
Event struct { | ||
// Data in this case is a simple int, but the actual | ||
// implementation would depend on the application. | ||
Data int64 | ||
} | ||
|
||
// Observer defines a standard interface for instances that wish to list for | ||
// the occurrence of a specific event. | ||
Observer interface { | ||
// OnNotify allows an event to be "published" to interface implementations. | ||
// In the "real world", error handling would likely be implemented. | ||
OnNotify(Event) | ||
} | ||
|
||
// Notifier is the instance being observed. Publisher is perhaps another decent | ||
// name, but naming things is hard. | ||
Notifier interface { | ||
// Register allows an instance to register itself to listen/observe | ||
// events. | ||
Register(Observer) | ||
// Deregister allows an instance to remove itself from the collection | ||
// of observers/listeners. | ||
Deregister(Observer) | ||
// Notify publishes new events to listeners. The method is not | ||
// absolutely necessary, as each implementation could define this itself | ||
// without losing functionality. | ||
Notify(Event) | ||
} | ||
) | ||
``` | ||
|
||
## Usage | ||
|
||
For usage, see [observer/main.go](observer/main.go) or [view in the Playground](https://play.golang.org/p/cr8jEmDmw0). |
Oops, something went wrong.