【デザインパターン勉強】Proxyメソッド

ざっくり概要

ある処理を肩代わりする代わりに出来ない処理が着た場合、 処理を他のクラスに肩代わさせるメソッドです。

生徒と先生の関係を考えてみます。

先生といえども、生徒の質問に全て答えられるわけではないですね。 数学の先生が英語の質問をされたときは、英語の先生(クラス)を呼び出して回答する そんなパターンです。

コード

import abc

class Teacher(metaclass=abc.ABCMeta):
    def __init__(self):
        self.subject = "Math"
    
    @abc.abstractmethod
    def question_1(self):
        pass
        
    @abc.abstractmethod
    def question_2(self):
        pass
    
class MathTeacher(Teacher):
    def question_1(self,question):
        print(question,"two")
        
    def question_2(self,question):
        EnglishTeacher().question_2(question)

class EnglishTeacher(Teacher):
    def question_1(self,question):
        MathTeacher().question_1(self,question)
    
    def question_2(self,question):
        print(question,"緑茶です。")

    
if __name__ == '__main__':
    # 生徒役
    MathTeacher().question_1("1+1 equal?") #1+1 equal ? two
    MathTeacher().question_2("what does mean green tea?") #what does mean green tea? 緑茶です。
        

ざっくり解説

今回の例では、生徒の質問(if name以下)はデフォルトで数学の先生(MathTeacherクラス) としておきます。question_2では、英語の質問なので、数学の先生は英語の先生に答えてもらってます。

状況としては数学の先生が同学年の英語の先生が病気のため代理で授業しているとシチューエーションをイメージして下さい。

mainにある処理のイメージを書き下すと、 question_1は数学の先生なんで余裕ですが、question_2は少しむずかしいかもしれません。そこで、1学年下の英語の先生に頼み込んで 回答している状況を示しています。

現実的な利用シーン(個人的感想)

代理で行なうメリットとしては、重いクラスの代理を軽いクラスで肩代わりすることが可能です。 例えば、

  • (あまり実感はないですが)クラスの初期化に呼び出されるコンストラクタが重い
  • DBをロードしなくてはいけない処理がある

といったケースでは代理を立てることで動きの遅いクラスを軽いクラスに肩代わりさせられます。

参考にしたもの

http://www.techscore.com/tech/DesignPattern/Proxy.html/