
「Decorator(デコレータ)」ってどんなパターン?
既存クラスのインターフェイスを変更せずに、機能を追加したい場合に使えるパターンです。
メリット
クラスを継承するよりも、自由度が高い方法で、機能を追加することができます。
どのようにクラス設計すればいいのか?
あるインターフェイスのサブクラスの機能拡張のために使用する「デコレータクラス」というのを作ります。
「デコレータクラス」は、機能を拡張したいサブクラスを、要素として持ち、さらにそのサブクラスのメソッドを拡張するためのメソッドも持たせます。
Adapterパターンとの違い
Adapterパターンは、あくまで他のサブクラスでもある特定の機能を使えるように仲介する役割であり、機能拡張はしないです。
それに対して、Decoratorパターンは、機能拡張そのものを行います。
Adapterパターンについては、下記の記事でも解説していますので、ご覧下さい。
実際に実装してみる。
実装イメージは、クラス図にすると下記になります。
Main.java(利用するクラス)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package Decorator; public class Main { public static void main(String args[]) { //装飾前 TanakaImpl tanaka = new TanakaImpl(); System.out.println(tanaka.getName()); //装飾後 BirthDayDecorator bdd = new BirthDayDecorator(tanaka); System.out.println(bdd.getName()); } } |
Employee.java(社員のインターフェイス)
1 2 3 4 5 6 7 |
package Decorator; public interface Employee { String getName(); } |
デコレーションパターンを使うと、このインターフェイスの内容を変えなくても、処理を変えられるというのがこのデザインパターンの肝になります。
TanakaImpl.java(田中という社員の実装クラス)
1 2 3 4 5 6 7 8 9 |
package Decorator; public class TanakaImpl implements Employee{ public String getName() { return "田中太郎"; } } |
BirthDayDecorator.java(社員名をデコレーションするクラス)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package Decorator; public class BirthDayDecorator implements Employee { Employee taisho; BirthDayDecorator(Employee taisho){ this.taisho = taisho; } public String getName() { //名前を装飾する。 String name = this.taisho.getName(); name += "さん。(*≧∀≦)φ…誕生日おめでとうございます♪"; return name; } } |
この記事へのコメントはありません。