package com.interview.design.pattern.structural;
import java.util.ArrayList;
import java.util.List;
/**
* Created_By: stefanie
* Date: 14-12-3
* Time: 上午11:13
*
* In Proxy pattern, a class represents functionality of another class.
* In Proxy pattern, we create object having original object to interface its functionality to outer world.
*
* 代理模式的应用场景:
* 如果已有的方法在使用的时候需要对原有的方法进行改进,此时有两种办法:
* 1、修改原有的方法来适应。这样违反了“对扩展开放,对修改关闭”的原则。
* 2、就是采用一个代理类调用原有的方法,且对产生的结果进行控制。这种方法就是代理模式。
* 使用代理模式,可以将功能划分的更加清晰,有助于后期维护!
*/
public class ProxyPattern {
static class Pat{
public static int CAT = 1;
public static int DOG = 2;
private int type;
private String name;
Pat(int type, String name) {
this.type = type;
this.name = name;
}
}
static interface PatMarket{
public List<Pat> availablePats();
}
static class RealPatMarket implements PatMarket {
private List<Pat> pats = new ArrayList<Pat>();
public List<Pat> availablePats(){
return pats;
}
}
static class DogProxy implements PatMarket {
PatMarket market;
public DogProxy(PatMarket market){
this.market = market;
}
public List<Pat> availablePats(){
List<Pat> dogs = new ArrayList<>();
for(Pat pat : market.availablePats()){
if(pat.type == Pat.DOG) dogs.add(pat);
}
return dogs;
}
}
static class CatProxy implements PatMarket {
PatMarket market;
public CatProxy(PatMarket market){
this.market = market;
}
public List<Pat> availablePats(){
List<Pat> cats = new ArrayList<>();
for(Pat pat : market.availablePats()){
if(pat.type == Pat.CAT) cats.add(pat);
}
return cats;
}
}
}