POOPOO: 배변 일기 앱
SMALL
구조패턴 목록
- 어댑터 패턴 (Adapter Pattern)
- 브릿지 패턴 (Bridge Pattern)
- 컴포짓 패턴 (Composite Pattern)
- 데코레이터 패턴 (Decorator Pattern)
- 퍼사드 패턴 (Facade Pattern)
- 플라이웨이트 패턴 (Flyweight Pattern)
- 프록시 패턴 (Proxy Pattern)
이미지 변환이나 디코딩과 같이 비용이 높은 경우에 가상프록시 패턴이 유용할 것 같고, 엑세스 관련 기능은 자주 사용되는 부분이기 때문에 보호프록시 패턴은 항상 필요로 할 것 같다.
장점
1) 가상 프록시 : 시간이 오래 걸리는 프로세스가 있다면 생성시 동작하도록 하던 로직을 함수를 호출하여 실행할 때 동작하도록 미뤄둘 수 있습니다. 따라서 프로그램이 시작되는 경우에는 오래 걸리지 않습니다.
2) 보호 프록시 : 권한별로 엑세스여부를 관리하는 경우에 사용하면 훨씬 더 편리하게 코드를 작성할 수 있습니다.
사용시기
1) 가상 프록시 : 생성하는 데 많은 비용이 드는 객체를 대신하는 역할을 하고, 실제 객체의 사용시점을 제어할 수 있습니다.
* 실제 객체는 클라이언트가 처음 요청 / 액세스 할 때만 생성되고 그 후에 프록시를 참조하여 객체를 재사용할 수 있습니다.
2) 보호 프록시 : 실제 사용자가 적절한 컨텐츠에 엑세스하는지 여부를 확인하기 위해 권한 부여 계층의 역할을 합니다.
* 사무실의 인터넷 액세스를 제한하는 프록시 서버. 유효한 웹 사이트와 컨텐츠만 허용되며 나머지는 차단.
UML - 가상 프록시
Interface Class : Text
public interface Text {
public String fatch();
}
Implement Class : SecretText, ProxyText
public class SecretText implements Text {
private String plainText;
public SecretText(String title){
this.plainText = SecretTextDecoder.decodeByTextTitle(title);
}
@Override
public String fetch(){
return plainText;
}
}
public class ProxyText implements Text {
private String title;
private Text text;
public ProxyText(String title){
this.title = title;
}
@Override
public String fetch(){
if(text == null){
text = new SecretText(title);
}
return "[proxy] : " + text.fetch();
}
}
Util Class : SecretTextDecoder
public class SecretTextDecoder {
public static String decodeByTextTitle(String title){
try{
Thread.sleep(300);
}catch(InterruptedException e){
e.printStackTrace();
}
return title;
}
}
Operation Class : ProxyPatternDemo, TextProvider
public class ProxyPatternDemo {
public static void main(String[] args){
List<Text> textList = new ArrayList<>();
textList.addAll(TextProvider.getSecretText(0,5));
textList.addAll(TextProvider.getProxyText(5,20));
textList.stream().map(Text::fetch).forEach(System.out::println);
}
}
public class TextProvider {
public static List<SecretText> getSecretText(int start, int end) {
return IntStream.range(start, end)
.mapToObj(i -> new SecretText(String.valueOf(i)))
.collect(Collectors.toList());
}
public static List<ProxyText> getProxyText(int start, int end) {
return IntStream.range(start, end)
.mapToObj(i -> new ProxyText(String.valueOf(i)))
.collect(Collectors.toList());
}
}
UML - 보호 프록시
Interface Class : OfficeInternetAccess
public interface OfficeInternetAccess {
public void grantInternetAccess();
}
Implement Class : ProxyInternetAccess, RealInternetAccess
public class ProxyInternetAccess implements OfficeInternetAccess {
private String employeeName;
private RealInternetAccess realInternetAccess;
public ProxyInternetAccess(String employeeName) {
this.employeeName = employeeName;
}
@Override
public void grantInternetAccess() {
if (getRole(employeeName) > 4) {
realInternetAccess = new RealInternetAccess(employeeName);
realInternetAccess.grantInternetAccess();
}
else {
System.out.println("No Internet access granted. Your job level is below 5");
}
}
public int getRole(String emplName) {
return 9;
}
}
public class RealInternetAccess implements OfficeInternetAccess {
private String employeeName;
public RealInternetAccess(String empName) {
this.employeeName = empName;
}
@Override
public void grantInternetAccess() {
System.out.println("Internet Access granted for employee: "+ employeeName);
}
}
Operation Class : ProxyPatternClient
public class ProxyPatternClient {
public static void main(String[] args) {
OfficeInternetAccess access = new ProxyInternetAccess("Ashwani Rajput");
access.grantInternetAccess();
}
}
출처 : https://www.javatpoint.com/
LIST