Files
org_roam/20251223215636-design_patterns_notes.html
2025-12-28 20:41:18 +00:00

369 lines
13 KiB
HTML
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<!-- 2025-12-24 Wed 14:03 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>design-patterns-notes</title>
<meta name="generator" content="Org Mode" />
<style type="text/css">
#content { max-width: 60em; margin: auto; }
.title { text-align: center;
margin-bottom: .2em; }
.subtitle { text-align: center;
font-size: medium;
font-weight: bold;
margin-top:0; }
.todo { font-family: monospace; color: red; }
.done { font-family: monospace; color: green; }
.priority { font-family: monospace; color: orange; }
.tag { background-color: #eee; font-family: monospace;
padding: 2px; font-size: 80%; font-weight: normal; }
.timestamp { color: #bebebe; }
.timestamp-kwd { color: #5f9ea0; }
.org-right { margin-left: auto; margin-right: 0px; text-align: right; }
.org-left { margin-left: 0px; margin-right: auto; text-align: left; }
.org-center { margin-left: auto; margin-right: auto; text-align: center; }
.underline { text-decoration: underline; }
#postamble p, #preamble p { font-size: 90%; margin: .2em; }
p.verse { margin-left: 3%; }
pre {
border: 1px solid #e6e6e6;
border-radius: 3px;
background-color: #f2f2f2;
padding: 8pt;
font-family: monospace;
overflow: auto;
margin: 1.2em;
}
pre.src {
position: relative;
overflow: auto;
}
pre.src:before {
display: none;
position: absolute;
top: -8px;
right: 12px;
padding: 3px;
color: #555;
background-color: #f2f2f299;
}
pre.src:hover:before { display: inline; margin-top: 14px;}
/* Languages per Org manual */
pre.src-asymptote:before { content: 'Asymptote'; }
pre.src-awk:before { content: 'Awk'; }
pre.src-authinfo::before { content: 'Authinfo'; }
pre.src-C:before { content: 'C'; }
/* pre.src-C++ doesn't work in CSS */
pre.src-clojure:before { content: 'Clojure'; }
pre.src-css:before { content: 'CSS'; }
pre.src-D:before { content: 'D'; }
pre.src-ditaa:before { content: 'ditaa'; }
pre.src-dot:before { content: 'Graphviz'; }
pre.src-calc:before { content: 'Emacs Calc'; }
pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
pre.src-fortran:before { content: 'Fortran'; }
pre.src-gnuplot:before { content: 'gnuplot'; }
pre.src-haskell:before { content: 'Haskell'; }
pre.src-hledger:before { content: 'hledger'; }
pre.src-java:before { content: 'Java'; }
pre.src-js:before { content: 'Javascript'; }
pre.src-latex:before { content: 'LaTeX'; }
pre.src-ledger:before { content: 'Ledger'; }
pre.src-lisp:before { content: 'Lisp'; }
pre.src-lilypond:before { content: 'Lilypond'; }
pre.src-lua:before { content: 'Lua'; }
pre.src-matlab:before { content: 'MATLAB'; }
pre.src-mscgen:before { content: 'Mscgen'; }
pre.src-ocaml:before { content: 'Objective Caml'; }
pre.src-octave:before { content: 'Octave'; }
pre.src-org:before { content: 'Org mode'; }
pre.src-oz:before { content: 'OZ'; }
pre.src-plantuml:before { content: 'Plantuml'; }
pre.src-processing:before { content: 'Processing.js'; }
pre.src-python:before { content: 'Python'; }
pre.src-R:before { content: 'R'; }
pre.src-ruby:before { content: 'Ruby'; }
pre.src-sass:before { content: 'Sass'; }
pre.src-scheme:before { content: 'Scheme'; }
pre.src-screen:before { content: 'Gnu Screen'; }
pre.src-sed:before { content: 'Sed'; }
pre.src-sh:before { content: 'shell'; }
pre.src-sql:before { content: 'SQL'; }
pre.src-sqlite:before { content: 'SQLite'; }
/* additional languages in org.el's org-babel-load-languages alist */
pre.src-forth:before { content: 'Forth'; }
pre.src-io:before { content: 'IO'; }
pre.src-J:before { content: 'J'; }
pre.src-makefile:before { content: 'Makefile'; }
pre.src-maxima:before { content: 'Maxima'; }
pre.src-perl:before { content: 'Perl'; }
pre.src-picolisp:before { content: 'Pico Lisp'; }
pre.src-scala:before { content: 'Scala'; }
pre.src-shell:before { content: 'Shell Script'; }
pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
/* additional language identifiers per "defun org-babel-execute"
in ob-*.el */
pre.src-cpp:before { content: 'C++'; }
pre.src-abc:before { content: 'ABC'; }
pre.src-coq:before { content: 'Coq'; }
pre.src-groovy:before { content: 'Groovy'; }
/* additional language identifiers from org-babel-shell-names in
ob-shell.el: ob-shell is the only babel language using a lambda to put
the execution function name together. */
pre.src-bash:before { content: 'bash'; }
pre.src-csh:before { content: 'csh'; }
pre.src-ash:before { content: 'ash'; }
pre.src-dash:before { content: 'dash'; }
pre.src-ksh:before { content: 'ksh'; }
pre.src-mksh:before { content: 'mksh'; }
pre.src-posh:before { content: 'posh'; }
/* Additional Emacs modes also supported by the LaTeX listings package */
pre.src-ada:before { content: 'Ada'; }
pre.src-asm:before { content: 'Assembler'; }
pre.src-caml:before { content: 'Caml'; }
pre.src-delphi:before { content: 'Delphi'; }
pre.src-html:before { content: 'HTML'; }
pre.src-idl:before { content: 'IDL'; }
pre.src-mercury:before { content: 'Mercury'; }
pre.src-metapost:before { content: 'MetaPost'; }
pre.src-modula-2:before { content: 'Modula-2'; }
pre.src-pascal:before { content: 'Pascal'; }
pre.src-ps:before { content: 'PostScript'; }
pre.src-prolog:before { content: 'Prolog'; }
pre.src-simula:before { content: 'Simula'; }
pre.src-tcl:before { content: 'tcl'; }
pre.src-tex:before { content: 'TeX'; }
pre.src-plain-tex:before { content: 'Plain TeX'; }
pre.src-verilog:before { content: 'Verilog'; }
pre.src-vhdl:before { content: 'VHDL'; }
pre.src-xml:before { content: 'XML'; }
pre.src-nxml:before { content: 'XML'; }
/* add a generic configuration mode; LaTeX export needs an additional
(add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
pre.src-conf:before { content: 'Configuration File'; }
table { border-collapse:collapse; }
caption.t-above { caption-side: top; }
caption.t-bottom { caption-side: bottom; }
td, th { vertical-align:top; }
th.org-right { text-align: center; }
th.org-left { text-align: center; }
th.org-center { text-align: center; }
td.org-right { text-align: right; }
td.org-left { text-align: left; }
td.org-center { text-align: center; }
dt { font-weight: bold; }
.footpara { display: inline; }
.footdef { margin-bottom: 1em; }
.figure { padding: 1em; }
.figure p { text-align: center; }
.equation-container {
display: table;
text-align: center;
width: 100%;
}
.equation {
vertical-align: middle;
}
.equation-label {
display: table-cell;
text-align: right;
vertical-align: middle;
}
.inlinetask {
padding: 10px;
border: 2px solid gray;
margin: 10px;
background: #ffffcc;
}
#org-div-home-and-up
{ text-align: right; font-size: 70%; white-space: nowrap; }
textarea { overflow-x: auto; }
.linenr { font-size: smaller }
.code-highlighted { background-color: #ffff00; }
.org-info-js_info-navigation { border-style: none; }
#org-info-js_console-label
{ font-size: 10px; font-weight: bold; white-space: nowrap; }
.org-info-js_search-highlight
{ background-color: #ffff00; color: #000000; font-weight: bold; }
.org-svg { }
</style>
</head>
<body>
<div id="content" class="content">
<h1 class="title">design-patterns-notes</h1>
<div id="table-of-contents" role="doc-toc">
<h2>Table of Contents</h2>
<div id="text-table-of-contents" role="doc-toc">
<ul>
<li><a href="#org1bb65db">1. Design patterns. What are they?</a>
<ul>
<li><a href="#orge09a476">1.1. OO concepts:</a>
<ul>
<li><a href="#org8c31d5f">1.1.1. Abstraction:</a></li>
<li><a href="#orgf31693b">1.1.2. Inheritance:</a></li>
<li><a href="#orgabea4a6">1.1.3. Encapsulation:</a></li>
<li><a href="#org33bf2fc">1.1.4. Polymorphism:</a></li>
</ul>
</li>
<li><a href="#orga0e9712">1.2. OO principles:</a></li>
<li><a href="#org8f57089">1.3. OO Patterns</a>
<ul>
<li><a href="#org477711e">1.3.1. Behavioural patterns</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
<div id="outline-container-org1bb65db" class="outline-2">
<h2 id="org1bb65db"><span class="section-number-2">1.</span> Design patterns. What are they?</h2>
<div class="outline-text-2" id="text-1">
<p>
They are reusable solutions to common problems in software design. They help to make code more flexible, maintainable, and scalable.
</p>
<p>
Patterns allow you to say more with less. When you use a pattern in a description, other developers quickly know precisely the design you have in mind.
</p>
</div>
<div id="outline-container-orge09a476" class="outline-3">
<h3 id="orge09a476"><span class="section-number-3">1.1.</span> OO concepts:</h3>
<div class="outline-text-3" id="text-1-1">
</div>
<div id="outline-container-org8c31d5f" class="outline-4">
<h4 id="org8c31d5f"><span class="section-number-4">1.1.1.</span> Abstraction:</h4>
<div class="outline-text-4" id="text-1-1-1">
<p>
Focuses on essential features while hiding unnecessary internal details, allowing developers to work with highlevel concepts instead of implementation complexity.
</p>
<p>
Example: A Car class exposes start() and stop() methods without revealing how the engine ignition system works.
</p>
</div>
</div>
<div id="outline-container-orgf31693b" class="outline-4">
<h4 id="orgf31693b"><span class="section-number-4">1.1.2.</span> Inheritance:</h4>
<div class="outline-text-4" id="text-1-1-2">
<p>
Enables one class to derive properties and behaviours from another, promoting code reuse and creating natural parentchild hierarchies.
</p>
<p>
Example: A Dog class inherits from an Animal class, automatically gaining attributes like age and methods like eat().
</p>
</div>
</div>
<div id="outline-container-orgabea4a6" class="outline-4">
<h4 id="orgabea4a6"><span class="section-number-4">1.1.3.</span> Encapsulation:</h4>
<div class="outline-text-4" id="text-1-1-3">
<p>
Protects an objects internal state by restricting direct access to its data and exposing controlled interfaces for interaction.
</p>
<p>
Example: A BankAccount class keeps its balance private and provides deposit() and withdraw() methods to modify it safely.
</p>
</div>
</div>
<div id="outline-container-org33bf2fc" class="outline-4">
<h4 id="org33bf2fc"><span class="section-number-4">1.1.4.</span> Polymorphism:</h4>
<div class="outline-text-4" id="text-1-1-4">
<p>
Allows different objects to respond to the same interface or method call in their own unique ways, enabling flexible and extensible system design.
</p>
<p>
Example: Calling makeSound() on an Animal reference triggers bark() for a Dog and meow() for a Cat.
</p>
</div>
</div>
</div>
<div id="outline-container-orga0e9712" class="outline-3">
<h3 id="orga0e9712"><span class="section-number-3">1.2.</span> OO principles:</h3>
<div class="outline-text-3" id="text-1-2">
<ul class="org-ul">
<li>Encapsulate what varies</li>
<li>Favor composition over inheritance</li>
<li>Program to interfaces, not implementations</li>
<li>Strive for loosely coupled designs between objects that interact</li>
</ul>
</div>
</div>
<div id="outline-container-org8f57089" class="outline-3">
<h3 id="org8f57089"><span class="section-number-3">1.3.</span> OO Patterns</h3>
<div class="outline-text-3" id="text-1-3">
<p>
You have:
</p>
<ul class="org-ul">
<li><b>behavioural</b> patterns</li>
<li><b>creational</b> patterns</li>
<li><b>structural</b> patterns</li>
</ul>
</div>
<div id="outline-container-org477711e" class="outline-4">
<h4 id="org477711e"><span class="section-number-4">1.3.1.</span> Behavioural patterns</h4>
<div class="outline-text-4" id="text-1-3-1">
</div>
<ol class="org-ol">
<li><a id="org2073a8f"></a>Structural:<br />
<div class="outline-text-5" id="text-1-3-1-1">
<p>
The Strategy Pattern defines a family of algorithms, encapsulates each one, and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.
</p>
</div>
</li>
<li><a id="org99ab840"></a>Observer:<br />
<div class="outline-text-5" id="text-1-3-1-2">
<p>
The Observer Pattern defines a one-to-many dependency between objects so that when
one object changes state, all of its dependents are notified and updated automatically.
</p>
<p>
Subjects, or as we also know them, Observables, update Observers using a common
interface
</p>
<p>
Observers are loosely coupled in that the Observable knows nothing about them,
other than that they implement the Observer interface.
</p>
<p>
You can push or pull data from the Observable when using the pattern (pull is
considered more “correct”).
</p>
<p>
Dont depend on a specific order of notification for your Observers.
</p>
<p>
Java has several implementations of the Observer Pattern, including the general
purpose java.util.Observable
</p>
</div>
</li>
</ol>
</div>
</div>
</div>
</div>
<div id="postamble" class="status">
<p class="date">Created: 2025-12-24 Wed 14:03</p>
<p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
</div>
</body>
</html>