エージェントモード(プロキシ・パターン)が構造的なデザインパターンです。プロキシモードを通じ、我々は助けるが、直接ターゲットによってアクセスすることができない、プロキシオブジェクトを介してターゲットオブジェクトにアクセスすることを向けます。同時に、我々は、プロキシオブジェクトを介して来ることができるアクセス制御すると強化された機能を。
レッツは、プロキシモードとプロキシモードもたらすのメリットが何であるかを説明するために、3つの例を使用します。
例1:購買
私たちは、この例に行きますので、エージェントモデルを購入すると、最も一般的な例を説明することで、免疫されていません。
仮定すると、ミルクの海は、私はこれを購入することによってヤギのミルクを買うことができるようにブランドのニーズを購入したい、我々はこれを言うことができます。
-
抽象テーマ別の役割(件名)
バイヤー -
本当のテーマ別の役割(実物)
I -
演技のテーマ別の役割(プロキシ)
ショッピング
これは、コードで表されます。
// 买家
abstract class Buyer {
abstract void buy(String item);
}
// 我
public class Me extends Buyer {
public void buy(String item) {
System.out.println("购买商品: " + item);
}
}
// 代购
class BuyingAgent extends Buyer {
// 代替我买
private Buyer me = new Me();
public void buy(String item) {
System.out.println("我是代购,我正在加拿大温哥华商场");
me.buy(item);
System.out.println("购买完毕,准备快递寄回委托人手里");
}
}
プログラムを実行します。
public static void main(String[] args) {
Buyer buyingAgent = new BuyingAgent();
buyingAgent.buy("A品牌奶粉");
}
出力は、操作後に得られます
私が購入した、私は、カナダのバンクーバーモールにあった
商品を購入する:Aブランドの粉ミルクの
購入が完了すると、手Expressのメールクライアントへの準備ができて
この例では、プロキシモードの基本的な使い方を反映しています。私たちは、プロキシクラスの実際のオブジェクト、メソッドを呼び出す前に、実際のオブジェクトが含まれます以降、我々はまた、他の関数を呼び出すか、他のロジックのコードを実行することができます。
例2:不動産業者
ケビンは、ヘルプ売りにこの家を不動産業者に尋ねたので、ケビンは家を売却する必要性を持っていると仮定すると、彼は市場の状況に、買い手に対処する時間がない方法を知りませんでした。
ケビンの不動産業者を助けることに加えて、あなたもすることができ、家を売る直接入札の下に心理的な価格を拒否し、ヘルプに、ケビン・フォローアップ取引書類と手続きと契約我々はこれらを理解することができますよう、機能強化を。
ここでは、住宅会社の義務は、バイヤーが直接、すべてのトランザクションがハウジング機関を通じて処理されなければならない販売者にご連絡防止、薬剤です。
私たちは、定義することができます。
-
抽象テーマ別の役割(件名)
売主 -
本当のテーマ別の役割(実物)
売主ケビン -
演技のテーマ別の役割(プロキシ)
不動産
これは、コードで表されます。
abstract class Seller {
abstract void sell(String house, int price);
}
class Kevin extends Seller {
public void sell(String house, int price) {
System.out.println("售出房产: " + house + ", 售价: " + price + "万");
}
}
class Agent extends Seller {
private Seller seller = new Kevin();
// 卖家可接受最低价格
private int acceptablePrice = 100;
public void sell(String house, int price) {
// 控制访问权限,出价过低不出售
if (!isPriceAcceptable(price)) {
System.out.println("抱歉," + price + "万出价过低。");
return;
}
System.out.println("接受出价" + price + "万");
seller.sell(house, price);
processDocuments();
}
private boolean isPriceAcceptable(int price) {
return price >= acceptablePrice;
}
// 功能增强:帮卖家处理交易手续
private void processDocuments() {
System.out.println("处理交易手续");
}
}
プログラムを実行します。
public static void main(String[] args) {
Seller agent = new Agent();
agent.sell("A套房产", 90);
agent.sell("A套房产", 100);
}
出力を取得
申し訳ありませんが、90万単価が低すぎです。
百万は入札受諾
不動産のAセット、価格:1,000,000不動産を売却した
トランザクション処理手順を
この例では、プロキシクラスがアクセスを制御し、他の機能強化をもたらすことができます参照してください。
- アクセス制御
オファーが実際のオブジェクトにアクセスすることはできませんが低すぎます - 強化された
トランザクション処理の手順
実施例3:プログラミングの実際のアプリケーション・シナリオ
我々は、ソフトウェア会社のために働いていた現在のフォーラムを開発していると仮定します。開発者のグループが良いの開発したメッセージを投稿するためのインタフェースを、そして私たちの仕事は、この投稿のインタフェースに加えて提供することですチェック投稿権限、および投稿ロギング機能を。
ここでは、このインタフェースは、グループAによって開発されているので、しかし、限界があり、ので、彼らは私たちが彼らのソースコードに移動したくない、ソフトウェア会社では非常に一般的なもので、異なるグループ間でのコードの反対側に移動しないようにしようので、どのように我々は我々の機能を実現するために、コードなしで反対側に移動する必要がありますか?
答えは:プロキシモード
私たちは、グループAのインターフェイスの開発を見てみましょう:
public interface PostService {
void makePost(String content, int userId);
}
public class PostServiceImpl implements PostService{
public void makePost(String content, int userId) {
// 发布帖子的逻辑
System.out.println("用户" + userId + "发布帖子成功");
}
}
我々は、ログを襲った後、プロキシクラスを作成し、プロキシモードを使用することができ、再び関数を呼び出し、我々は権限がプロキシクラスを投稿機能を呼び出し、実際のオブジェクトの前にチェックして、ポストの機能を公開し、実際のオブジェクトを呼び出すさせて頂きます。
public class PostServiceProxy implements PostService {
private PostService postService = new PostServiceImpl();
public void makePost(String content, int userId) {
// 先进性权限检查
validateAuthentication(userId);
// 再实际调用发帖函数
postService.makePost(content, userId);
// 之后打上日志
logActivity("发布帖子", userId);
}
private void validateAuthentication(int userId) {
System.out.println("检查用户" + userId + "权限");
}
private void logActivity(String activity, int userId) {
System.out.print("记录用户" + userId + "活动: " + activity);
}
}
実際にプログラムを実行しています:
public static void main(String[] args) {
PostService postService = new PostServiceProxy();
int userId = 1;
postService.makePost("新人报道帖!", userId);
}
結果:
1人のチェックユーザー権限の
成功投稿ユーザー
投稿:レコードユーザのアクティビティ1を
これは、プロキシクラスの外部で作成されたオブジェクトに加えて、ビューの呼び出し側の視点から見ることができ、実際の使用量は実際のオブジェクトと違いはありませんが、ログをチェックして、二つの機能を再生する権限を増やすことができ、これは強力な代理店モデルです場所。