実際の処理をそのままに、処理のインターフェースだけを変更する

 処理のインターフェースの記述にC#でいうinterfaceを用いて、実際の処理にinterfaceを実装させると、インターフェースの変更は実際の処理の再コンパイルを伴う。この場合の参照関係は実際の処理が処理のインターフェースを参照する形になる。

 処理のインターフェースの記述にクラスを使い、実際の処理に委譲すると、再コンパイルなしで自由にインターフェースを変更できるようになるが、参照関係は処理のインターフェースが実際の処理を参照する形になり、実際の処理を単独で変更することが出来なくなる。

 処理のインターフェース、処理のコンポジション、実際の処理の三つに分ければ、インターフェースとコンポジションを変更することで実際の処理を変更せずにインターフェースを変更することが出来る。参照関係は処理のインターフェース<-処理のコンポジション->実際の処理という形になる。

 一つのアプリであるならば、処理のインターフェースを変えずに実際の処理を変更して振る舞いを変える需要が大きい。しかし実際の処理が自分の知らないところで使われ、再コンパイルが難しく、かつ使用側が変わる可能性があるなら、実際の処理を何も参照しない形にして単独で存在させ、インターフェースとコンポジションを介して接続することで、インターフェースをそのままに振る舞いを変えることにも実際の処理をそのままにインターフェースを変更することにも対応させられる。

 ただ処理のコンポジションの作成には莫大な手間がかかることもある。実際の処理を他のアプリで再利用したいのでない限りは作る必要はないだろう。たいがいの処理は他のアプリでは使えない。

 newするものをコンポジションと考えることも出来る。実際の処理がinterfaceを実装していない場合糊が必要になるわけだが、interfaceを実装している場合でもコンポジションは消すことが出来ないと言えるかもしれない。といってもnewするだけなのでコンポジションというほどのこともないのだが。