Skip to content

Commit

Permalink
feat: update articles
Browse files Browse the repository at this point in the history
  • Loading branch information
wx-chevalier committed Sep 21, 2024
1 parent 61bb0d1 commit 6a1d34c
Show file tree
Hide file tree
Showing 29 changed files with 1,665 additions and 0 deletions.
34 changes: 34 additions & 0 deletions 99~参考资料/2016~《Go Patterns》/.gitignore
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
25 changes: 25 additions & 0 deletions 99~参考资料/2016~《Go Patterns》/.travis.yml
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
31 changes: 31 additions & 0 deletions 99~参考资料/2016~《Go Patterns》/CONTRIBUTING.md
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
```
110 changes: 110 additions & 0 deletions 99~参考资料/2016~《Go Patterns》/README.md
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 ||
62 changes: 62 additions & 0 deletions 99~参考资料/2016~《Go Patterns》/SUMMARY.md
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)
17 changes: 17 additions & 0 deletions 99~参考资料/2016~《Go Patterns》/book.json
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": ""
}
}
}
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&mdash;such as webservers&mdash;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).
Loading

0 comments on commit 6a1d34c

Please sign in to comment.