[デザインモード]Proxyモード


Proxyモードとは?


ページは下にスクロールされておらず、下の画像を事前にロードする必要はありません.
では、ロードされていない場所はどのように処理すればいいのでしょうか.
直接写真を入れたくないなら、代理店を置いたほうがいいです.
この場合、そのまま使うのが「Proxyモード」です.
Proxyは英語の単語で、エージェントを意味し、エージェントとも呼ばれています.
ProxyPatternは、特定の機能を実行するオブジェクトの代わりにアクセスまたはストリームを制御する設計モードです.

ProxyモードUML図



Proxyモードは、Subject、Real Subject、Proxyから構成されます.
使用するクライアントはSubjectを介してSubjectを使用します.
Subjectは、実装されていないDoActionなどの共通のインタフェースを宣言するインタフェースで構成されています.
RealSubjectはそれを継承し、必要な操作のためにコードを記述します.
エージェントとして呼び出されたProxyのDoActionは、RealSubjectを呼び出すか、RealSubjectを呼び出さないかに分けられます.RealSubjectを呼び出す必要があるため、依頼と呼ばれる参照オブジェクトがあります.

Proxyパターンのタイプ


1.リモートエージェント
他のアドレスに存在するオブジェクトのローカル表示.エージェントクラスはローカルに、真のボディはリモートに配置されます.proxyを使用してリモートオブジェクトをマウントすると考えられます.
2.仮想エージェント
ゲームキャラクタのように複雑なオブジェクトが必要な場合に生成されます.複雑なオブジェクトの作成にはコストがかかるため、作成を遅らせたり、個別に処理したりします.
3.保護エージェント
Proxyはエージェントのほかに他の役割を果たすことができます.
保護エージェントの場合、元のオブジェクトへのアクセス権を制御します.
4.スマートリファレンス
スマートリファレンスも追加の役割を果たしています.オブジェクトにアクセスするときに他のアクションを実行します.また、参照の回数を管理したり、変更を防止するためにオブジェクトを記録したりします.

Proxyモードの利点


このProxyモードを採用するとどんなメリットがありますか?
  • 最適化:複雑なオブジェクトの作成を遅らせることで、不要なワークロードを削減し、最適化できます.
  • 透明性:お客様の観点から、複雑なプロセスを知らずに処理できます.細部を隠さないように!
  • Proxyパターンの例


    プロキシモードでは、複雑なオブジェクトの作成を遅らせることができます.また、アクセス制御の役割も実行できます.次の例では、アクセスを制御する方法について説明します.
    デパートでは、ユーザーが決済時にログインしている場合は、カートページに入ります.そうしないと、ログインページに入り、会員でない場合はカートに入ることができません.このようなプログラムを設計します.
    まずユーザインタフェースを設計し,会員と非会員をサブクラスにする.
    public interface User{ 
    	public void checkout(); 
    }
    
    public class Guest implements User{
    	public void checkout(){
        		System.out.printlnI("login page"); 
        }
    }
    public class AuthorizedUser implements User{
    	public void checkout(){
        		System.out.println("checkout page"); 
         }
    }
    Proxyはこれらのユーザーを選択して生成します
    public interface UserProxy{
    	public User getUser(); 
    }
    public class UserProxyHandler implements UserProxy{
    	private boolean isLoggedin ;
        UserProxyHandler(boolean isLoggedin){ 
        		this.isLoggedin = isLoggedin; 
        }
    	public User getUser(){
        	User user; 
        	if(isLoggedin){
            	user = new AuthorizedUser();
            }else
            	user = new Guest();
        }
        return user; 
    }