プロキシモードの定義:プロキシモードは特定のオブジェクトのプロキシオブジェクトを提供し、プロキシオブジェクトは元のオブジェクトへの参照を制御します。たとえば、ある人または組織が別の人または別の組織に代わって行動します。場合によっては、クライアントがオブジェクトを望まないか、直接参照することができず、プロキシオブジェクトがクライアントとターゲットオブジェクトの間の仲介役として機能することがあります。
上記のエージェンシーモデルの説明から、オブジェクトの参照を制御することが目的であることがわかります。ライフシーンでは、例として車の購入を取り上げます。車を購入する場合は、car4Sショップを経由する必要があります。car4sショップはエージェントとして機能します。その目的自動車購入者の自動車購入行動を管理するためです。自動車メーカーから自動車を購入するには、自動車4Sショップを経由する必要があります。
プロキシオブジェクトは通常、プロキシオブジェクトと同じインターフェイスを実装します。
1.)最初に車を購入するための新しいインターフェースを作成します
public interface IBuyCar {
//买车
void buyCar();
}
2.)車を購入したい顧客を宣言し、車の購入インターフェイスを実装します
public class Customer implements IBuyCar {
private int cash;//购车款
public int getCash() {
return cash;
}
public void setCash(int cash) {
this.cash = cash;
}
@Override
public void buyCar() {
Log.e("buyCar", "买一辆车花费了-->" + cash + "元");
}
}
3.)車の代理店として車を購入する4Sショップも車購入インターフェースを実装し、顧客からの注文を受け入れる必要があることを宣言します
public class BuyCarProxy implements IBuyCar{
private Customer customer;//接收买车客户
public BuyCarProxy(Customer customer){
this.customer=customer;//接收买车客户
}
@Override
public void buyCar() {//实现为客户买车
customer.buyCar();
}
}
4.)車の購入をシミュレートするクライアントを作成します
Customer customer=new Customer();
customer.setCash(120000);
BuyCarProxy buyCarProxy=new BuyCarProxy(customer);
buyCarProxy.buyCar();
5.)プロキシモードによる権限制御の実現
上記の例を通して、私たちは質問があるかもしれません、私たちは車を買うために直接メーカーに行くことができませんか?もちろん、実装クラスが使用シナリオの要件を満たすことができる場合は、もちろんクラスを直接実装できますが、実装クラスが要件を満たせない場合は、要件を拡張する必要があります。開閉の原則に従って、実装クラスコードを変更することはできません。プロキシクラスを使用します。たとえば、車を購入するには、お客様の購入審査を行う必要があります。条件を満たしている場合は車を購入し、要件を満たしていない場合は購入価格が不足していることをお客様に通知します。
@Override
public void buyCar() {//实现为客户买车
int cash=customer.getCash();
if(cash<100000){
Log.e("buyCar","你的钱不够买一辆车");
return;
}
customer.buyCar();
}