Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
デザインパターン勉強会(Facade&Mediator)
Search
Java女子部
November 29, 2022
Programming
220
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
デザインパターン勉強会(Facade&Mediator)
https://javajo.doorkeeper.jp/events/144579
Java女子部
November 29, 2022
More Decks by Java女子部
See All by Java女子部
モダンJava再入門ハンズオン Java in Education For JUGs
javawomen
0
190
デザパタ勉強会!Bridgeパターン
javawomen
0
140
みんな大好きJava 8から9月リリースJava 17まで!最近のJava事情あれこれ / Java catch up from 8 to 17
javawomen
2
1.2k
お客様の中にJava女子部とお付き合いしてくださる方はいませんか?
javawomen
0
360
【子ども向けハンズオン】 ゲームで学ぼう、プログラミング!
javawomen
0
890
Java女子部について
javawomen
1
97
Other Decks in Programming
See All in Programming
Lean は証明の正しさを確認するためだけのツールって思ってませんか?
inoueasei
1
140
<title><a id="</title>君はこのHTMLをパースできるか"></a></title> #雑LT_study
pizzacat83
0
130
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
550
今さら聞けない .NET CLI
htkym
0
180
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
490
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
1
270
TSX の <Hoge<Fuga>> という構文に驚いた話 / tsx-type-argument-syntax
kanaru0928
0
200
React本体のコードリーディング
high_g_engineer
1
130
Built Our Own Background Agent at LayerX
layerx
PRO
9
4.9k
VibeCodingからAgenticWorkflowへ
starfish719
0
230
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
1.7k
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
660
Featured
See All Featured
Embracing the Ebb and Flow
colly
88
5.1k
The Invisible Side of Design
smashingmag
301
52k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.2k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
230
Building AI with AI
inesmontani
PRO
1
1.1k
How STYLIGHT went responsive
nonsquared
100
6.2k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.8k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.7k
Raft: Consensus for Rubyists
vanstee
141
7.6k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.2k
Speed Design
sergeychernyshev
33
2k
Transcript
デザインパターン勉強会 2022/11/26 Java女子部 めだか & あや
Facadeパターン
よみかた ファサード Facadeパターン
Facadeパターンとは 大規模で複雑なプログラムなどで、クラスの依存関係や各クラスのメソッドを呼 ぶ順番が暗黙知になってしまうため高度なインターフェースを提供する
classを使っての説明 Main PageMaker Database HtmlWriter Facade PageMakerのpublicのメソッド内で Database→HtmlWriterの順番で実行する HtmlWriterを呼び出す前にDatabaseを 呼び出す必要がある
その順番を守るためにFacadeがある
実際にFacadeやってみた Mainクラス import pagemaker.PageMaker; public class Main { public static
void main(String[] args) { PageMaker.makeWelcomePage("Aya", "welcome.html"); } }
実際にFacadeやってみた public class PageMaker { private PageMaker() { } public
static void makeWelcomePage(String name, String filename) { try { Properties foodprop = Database.getProperties("food"); String food = foodprop.getProperty(name); HtmlWriter writer = new HtmlWriter(new FileWriter(filename)); writer.title(name + "'s web page"); writer.paragraph("Welcome to " + name + "'s web page!"); writer.paragraph("好きな食べ物は" + food); writer.close(); System.out.println(filename + " is created for " + name + " (" + food + ")"); } catch (IOException e) { e.printStackTrace(); } } } 名前でDBからデータを 取得して、webページ を作成するクラス
実際にFacadeやってみた public class Database { private Database() { } public
static Properties getProperties(String dbname) throws IOException { String filename = dbname + ".txt"; Properties prop = new Properties(); prop.load(new FileReader(filename)); return prop; } } 名前から好きな食べ物を取得するためのDBクラス
実際にFacadeやってみた public class HtmlWriter { private Writer writer; public HtmlWriter(Writer
writer) { this.writer = writer; } public void title(String name) throws IOException { writer.write("<!DOCTYPE html>"); writer.write("<html>"); writer.write("<head>"); writer.write("<title>" + name + "</title>"); writer.write("</head>"); writer.write("<body>"); writer.write("\n"); writer.write("<h1>" + name + "</h1>"); writer.write("\n"); } public void paragraph(String msg) throws IOException { writer.write("<p>" + msg + "</p>"); writer.write("\n"); } public void link(String food) throws IOException { paragraph(food); } public void close() throws IOException { writer.write("</body>"); writer.write("</html>"); writer.write("\n"); writer.close(); } } HTMLファイルを作成するクラス
実際にFacadeやってみた <!DOCTYPE html><html><head><title>Aya's web page</title></head><body> <h1>Aya's web page</h1> <p>Welcome to
Aya's web page!</p> <p>好きな食べ物はRamen Jiro</p> </body></html> 生成されたHTML
実際にFacadeやってみた 実際できた画面
Facadeがないと 呼び出す側が複雑な依存関係、順番などを意識する必要がある ※クラスが増えるほど大変(呼び出し側、呼び出される側どちらも) 今回の場合、Mainクラスの実装者がDatabase→HtmlWriterの順番呼び出すとい うことを意識しなければならない。 →Mainクラスのようなものが増えたら…?大変
どの順番で呼び出したいんだっけ?ってなる 右と左の図、どっちが呼び出し順序正しいんだっけ? Facadeがないと Main Database HtmlWriter Main HtmlWriter Database
だからFacadeが必要! 大規模開発になればなるほど、メソッドを呼び出す順番がソースコード上に現れ ていることが必要になる。 →Facadeが必要。
ソースコード https://github.com/java-women/202211DesignPattern/tree/main/facade
Mediatorパターン
Mediatorパターンとは Mediatorパターン:相談するクラス(複数)→相談される&指示を出すクラス (1つ)という双方向の関係性が成り立っている。 ※前節のFacadeは使用するクラス→使用されるクラスという片方向であるという 点で対照的である リーダー (相談役) メンバー (相談者) メンバー
(相談者) メンバー (相談者) Mediatorの図 指示をする 相談する
Mediator 簡易的なクラス図(サンプルソース) LoginFrame Button TextField CheckBox ボタンの 有効/無効を指示 Colleague テキストが入力され
てるかどうか通知する どちらがチェック されてるか通知する テキストの 有効/無効を指示
相談 指示 指示 Mediatorがないと メンバーが直接メンバーに指示と相談をすることになる リーダー (相談役) 指示 メンバー (相談者)
メンバー (相談者) メンバー (相談者) Mediatorがない図
だからMediatorが必要! 直接メンバー(Colleague)同士でやりとりをしないで良い →メンバー同士の複雑な依存関係が解消される ・複雑な部分がMediatorに集中し、特定のメンバーを見れば良くなるため、改修 (デバッグ)が容易。 ・メンバーが増えても改修が容易
おわりに Facadeパターン 処理の順序を整理したインターフェースを用意するパターン Mediatorパターン 処理同士の絡み合いを一本化するクラスを用意するパターン