プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • デザインパターン
  • 【GoFのデザインパターン】「Proxy(プロキシ)」ってどんなパターン?
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【GoFのデザインパターン】「Proxy(プロキシ)」ってどんなパターン?

05.13

  • miyabisan2
  • コメントを書く

この記事は1分で読めます

「Proxy(プロキシ)」ってどんなパターン?

既存クラスのメソッドが呼ばれた際に、一旦中間的な処理を実行してから渡すパターンです。

メリット

あるメソッドに、中間的な処理を加えることができます。

中間的な処理の例としては下記です。

  • メソッドの呼び出し、完了をログに記録する。
  • メソッドの実行可否を判定する。(機能的な意味ではなく、権限的な意味で。)

クラス設計の方法

インターフェイスを作って、「プロキシを適用したいクラス」と、「プロキシを実装するクラス」にそれぞれインターフェイスを実装させて、「プロキシを実装するクラス」にだけ、処理を追加する設計にします。

Decorator(デコレータ)との違いは?

Decoratorも、デコレータ用のクラスを作って、同じインターフェイスを実装させる設計になっており似ていますよね。

「Decorator」と「Proxy」違いとしては、下記です。

パターン 特徴
Decorator 既存の処理に機能を追加する。
Proxy 既存の処理に、機能とは違う別の処理(ログ出力等)を追加する。

実際に実装してみる。

下記のようなクラス図になります。

Main.java(メインプログラム)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package proxy;
 
public class Main {
 
public static void main(String[] args) {
 
//プロキシ適用前
Usually usu = new Usually();
usu.MethodA();
 
System.out.println("------------------");
 
//プロキシ適用後
ProxyImpl proxy = new ProxyImpl(usu);
proxy.MethodA();
 
}
 
}

ProxyTest.java(プロキシのインターフェイス)

1
2
3
4
5
package proxy;
 
public interface ProxyTest {
void MethodA();
}

Usually.java(普通のクラス:これをプロキシに一旦ゆだねる。)

1
2
3
4
5
6
7
8
9
package proxy;
 
public class Usually implements ProxyTest{
 
public void MethodA() {
System.out.println("普通の処理です。");
}
 
}

ProxyImpl.java(プロキシの実装クラス)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package proxy;
 
public class ProxyImpl implements ProxyTest {
ProxyTest proxytest;
 
ProxyImpl(ProxyTest proxytest){
this.proxytest = proxytest;
}
 
public void MethodA() {
System.out.println("処理を開始します。");
proxytest.MethodA();
System.out.println("処理を終了します。");
}
 
}

実行結果

プロキシの適用後では、処理が追加されていることがわかります。

スポンサーリンク
  • 2018 05.13
  • miyabisan2
  • コメントを書く
  • Java, オブジェクト指向, デザインパターン
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2018 05.03

    【Java】インナークラスについて(メンバクラス、ローカルクラス、匿名クラス)

  2. 2018 05.12

    【GoFのデザインパターン】「Builder」ってどんなパターン?

  3. 2018 05.05

    【Java】ソフトウェアのライセンスについて

  4. 2018 05.03

    【Java】関数オブジェクト(Java8以降)

  5. 2018 05.04

    【オブジェクト指向】多様性(ポリモーフィズム)のメリット

  6. 2022 05.21

    【オブジェクト指向】「インターフェース分離の原則」について

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【GoFのデザインパターン】「Flyweight(フラ…

【Spring Framework】AOP(アスペクト…

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • cursor
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • gRPC
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー