세 가지 예 7 분 29 개 포인트로 더 많은 인터뷰를 지불, 프록시 모드를 이해하는

에이전트 모드 (프록시 패턴) 구조 디자인 패턴입니다. 프록시 모드를 통해, 우리는 도움이되지 수 있지만, 직접 대상에 액세스 할 프록시 객체를 통해 대상 개체에 액세스 할 수 켜십시오. 동시에, 우리는 프록시 개체를 통해 올 수있는 액세스 제어향상된 기능을 .

하자 프록시 모드와 프록시 모드 제공의 혜택이 무엇인지 설명하는 세 가지 예를 사용합니다.

예 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品牌奶粉");
}

출력은 수술 후 수득

내가 구입했다, 내가 밴쿠버, 캐나다 쇼핑몰이었다
브랜드 분유 : 제품을 구입하기 위해
손 익스프레스 메일 클라이언트 준비 구매가 완료되면,

이 예는 프록시 모드의 기본적인 사용법을 반영한다. 우리는 프록시 클래스의 실제 개체 및 메서드를 호출하기 전에 실제 개체를 포함 할 것이다 이상, 우리는 또한 다른 함수를 호출하거나 다른 로직 코드를 실행할 수 있습니다.

예 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);
}

출력을 얻을

죄송합니다, 900,000 입찰가가 너무 낮습니다.
백만 입찰 수락
부동산의 세트 가격 : 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 : 게시

그것은 프록시 클래스 외부에서 생성 된 객체에 추가,보기의 호출자의 관점에서 볼 수있는, 실제 사용은 실제 개체와 다르지 않습니다 만, 로그를 확인하고 두 가지 기능을 재생 권한을 증가시킬 수있다, 이것은 강력한 기관 모델입니다 장소.

게시 14 개 원래 기사 · 원 찬양 8 · 전망 2198

추천

출처blog.csdn.net/vandavidchou/article/details/103568394