プロキシパターン分類:
- 静的プロキシ
- 動的プロキシ
1.1静的プロキシ
静的エージェントの役割分析
- 抽象ロール:通常、インターフェースまたは抽象クラスを使用して実装されます。
- 実際の役割:プロキシされる役割。
- 演技の役割:実際の役割を演じる;実際の役割を演じた後、いくつかの補助的な操作が通常行われます。
- クライアント:エージェントの役割を使用して、いくつかの操作を実行します。
1.2コード例
賃貸インターフェース(抽象的な役割)
package cn.guardwhy.domain;
// 抽象角色:租房
public interface Rent {
public void rent();
}
家主
package cn.guardwhy.domain;
// 真实角色: 房东,要出租房子
public class Landlord implements Rent {
@Override
public void rent() {
System.out.println("房屋出租!!!");
}
}
プロキシはプロキシの役割です
package cn.guardwhy.proxy;
import cn.guardwhy.domain.Landlord;
import cn.guardwhy.domain.Rent;
public class Proxy implements Rent {
private Landlord landlord;
public Proxy() {
}
public Proxy(Landlord landlord) {
this.landlord = landlord;
}
@Override
// 租房
public void rent() {
// 调用方法
seeHouse();
landlord.rent();
agreement();
fare();
}
// 看房
public void seeHouse(){
System.out.println("带房客看房!!!");
}
// 合同
public void agreement(){
System.out.println("签租赁合同...");
}
// 收中介费
public void fare(){
System.out.println("收中介费");
}
}
クライアント(テナント)
package cn.guardwhy.client;
import cn.guardwhy.domain.Landlord;
import cn.guardwhy.proxy.Proxy;
public class Client {
public static void main(String[] args) {
// 1.房东租房子
Landlord landlord = new Landlord();
// 2.代理,中介帮房东租房子
Proxy proxy = new Proxy(landlord);
// 3.不需要直接面对房东,直接找中介租房即可
proxy.rent();
}
}
の結果
分析結果
このプロセスでは、実際の生活と同じように、仲介業者と直接連絡を取ります。家主は見えませんが、いわゆる代理店モデルである代理店を通じて家主の家を借ります。
1.3静的プロキシの機能
利点:
- 私たちの本当の役割をより純粋にすることができます。いくつかの公共の事柄にもはや注意を払う必要はありません。
- 公務は代理人が行い、分業を実現します。
- 公共サービスが拡大するにつれて、それらはより集中化されて便利になります。
短所:
クラスやエージェントクラスが増え、作業負荷が大きくなり、開発効率が低下します。
2.1静的プロキシの再理解
1.抽象的な役割
package cn.guardwhy.domain;
// 抽象角色,增删改查业务
public interface UserService {
void add();
void delete();
void update();
void query();
}
2.追加、削除、変更の操作を完了するための実際のオブジェクト
package cn.guardwhy.domain;
// 真实对象,完成增删改查的操作
public class UserServiceImpl implements UserService{
@Override
public void add() {
System.out.println("增加了一个用户");
}
@Override
public void delete() {
System.out.println("删除了一个用户");
}
@Override
public void update() {
System.out.println("更新了一个用户");
}
@Override
public void query() {
System.out.println("查询一个用户");
}
}
3.ログを処理するためのプロキシクラスを設定します
package cn.guardwhy.proxy;
import cn.guardwhy.domain.UserService;
import cn.guardwhy.domain.UserServiceImpl;
public class UserServiceProxy implements UserService {
private UserServiceImpl userService;
public UserServiceImpl getUserService() {
return userService;
}
public void setUserService(UserServiceImpl userService) {
this.userService = userService;
}
@Override
public void add() {
message("添加方法");
userService.add();
}
@Override
public void delete() {
message("删除方法");
userService.delete();
}
@Override
public void update() {
message("更新方法");
userService.update();
}
@Override
public void query() {
message("查询方法");
userService.query();
}
public void message(String msg){
System.out.println("执行了" + msg + "方法!!");
}
}
4.テストコード
package cn.guardwhy.client;
import cn.guardwhy.domain.UserServiceImpl;
import cn.guardwhy.proxy.UserServiceProxy;
public class Client2 {
public static void main(String[] args) {
// 1.真实业务
UserServiceImpl userService = new UserServiceImpl();
// 2.代理类
UserServiceProxy proxy = new UserServiceProxy();
// 3.使用代理类实现日志功能
proxy.setUserService(userService);
// 调用方法
proxy.add();
}
}