태그 보관물: Strategy Pattern

Specification Pattern

이 패턴에 대해서, 위키피디아는 “Recombinable business logic in a boolean fashion” 이라고 정의하고 있다. 이 말은 비지니스 로직을 처리하는데 if~else를 많이 쓰는데, 이 if~else를 제거하고 비지니스 로직을 확장하기 쉽게 Composition하는 패턴이라고 설명을 하는 것이다. 그리고, 로직이 다른 개별 클래스가 계속 추가 된다면, Strategy Pattern과 유사한 형태가 되겠다. 하지만, Strategy Pattern은 데이타에 대한 처리나 체크를 Concrete Strategy에서 하고 Specification Pattern은 모델의 Provider 클래스가 처리를 대행하는 형태라는게 다르다.

아래 링크도 참고하면 좋겠다.
http://en.wikipedia.org/wiki/Specification_pattern#C.23

아래는 예제 코드이다.

package net.sjava.patterns.specification;

/**
 * 
 * @author mcsong@gmail.com
 * @since 2009. 9. 16.
 */
public class User {
	/**
	 * name
	 */
	private String name;
	/**
	 * city
	 */
	private String city;
	/**
	 * address
	 */
	private String address;
	/**
	 * company
	 */
	private String companyName;

	/**
	 * @return the name
	 */
	public String getName() {
		return name;
	}

	/**
	 * @param name
	 *            the name to set
	 */
	public void setName(String name) {
		this.name = name;
	}

	/**
	 * @return the city
	 */
	public String getCity() {
		return city;
	}

	/**
	 * @param city
	 *            the city to set
	 */
	public void setCity(String city) {
		this.city = city;
	}

	/**
	 * @return the address
	 */
	public String getAddress() {
		return address;
	}

	/**
	 * @param address
	 *            the address to set
	 */
	public void setAddress(String address) {
		this.address = address;
	}

	/**
	 * @return the company
	 */
	public String getCompanyName() {
		return companyName;
	}

	/**
	 * @param company
	 *            the company to set
	 */
	public void setCompanyName(String company) {
		this.companyName = company;
	}
}
package net.sjava.patterns.specification;

/**
 * 
 * @author mcsong@gmail.com
 * @since 2009. 9. 16.
 */
public interface IUserSpecification {
	/**
	 * 
	 * @param user
	 * @return
	 */
	public boolean isSatisfied(User user);
}
package net.sjava.patterns.specification;

/**
 * 
 * @author mcsong@gmail.com
 * @since 2009. 9. 16.
 */
public abstract class AbstractUserSpecification implements IUserSpecification {
	@Override
	public boolean isSatisfied(User member) {
		// TODO Auto-generated method stub
		return true;
	}
}
package net.sjava.patterns.specification;
 
/**
 * 
 * @author mcsong@gmail.com
 * @since 2009. 9. 16.
 */
public class CompanySpecification extends AbstractUserSpecification {
    /**
	*
	*/
    private String companyName;
 
    /**
     * 
     * @param companyName
     */
    public CompanySpecification(String companyName) {
        this.companyName = companyName;
    }
 
    @Override
    public boolean isSatisfied(User user) {
        // TODO Auto-generated method stub
        if (user == null)
            return false;
 
        return user.getCompanyName().equals(this.companyName);
    }
}
package net.sjava.patterns.specification;

import java.util.ArrayList;

/**
 * 
 * @author mcsong@gmail.com
 * @since 2009. 9. 16.
 */
public class UserProvider {
	/**
	*
	*/
	private static ArrayList<User> users = new ArrayList<User>();
	/**
	*
	*/
	private static java.util.concurrent.atomic.AtomicBoolean isLoaded = null;

	/**
	*
	*/
	private UserProvider() {
		if (isLoaded == null) {
			isLoaded = new java.util.concurrent.atomic.AtomicBoolean();
			UserProvider.isLoaded.set(true);
			UserProvider.provideUsers();

		}
	}

	/**
	 * 
	 * @return
	 */
	public static UserProvider provider() {
		return new UserProvider();
	}

	/**
	 * dummy data 입력
	 */
	public static void provideUsers() {
		for(int i=0; i < 10; i++) {
			User user = new User();
			user.setName(String.valueOf(i));
			user.setCity("서울");
			user.setAddress(String.valueOf(i) + " 번지");
			if(i < 5)
			user.setCompanyName("회사");
			else
			user.setCompanyName("백수");
			 
			users.add(user);
		}
	}

	/**
	 * 
	 * @param user
	 * @return
	 */
	public ArrayList<User> getSpecificationList(IUserSpecification specification) {
		ArrayList<User> list = new ArrayList<User>();
		for(int i=0; i < users.size(); i++) {
			if(specification.isSatisfied(users.get(i)))
				list.add(users.get(i));
		}
		return list;
	}
}
import java.util.ArrayList;
import net.sjava.patterns.specification.User;
import net.sjava.patterns.specification.UserProvider;
import net.sjava.patterns.specification.IUserSpecification;
import net.sjava.patterns.specification.CompanySpecification;

public class SpecificationPatternTest {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ArrayList<User> users = null;
		IUserSpecification spec = null;
		spec = new CompanySpecification("회사");
		users = UserProvider.provider().getSpecificationList(spec);

		for (int i = 0; i < users.size(); i++) {
			System.out.println(i + users.get(i).getCompanyName());
		}

		spec = new CompanySpecification("백수");
		users = UserProvider.provider().getSpecificationList(spec);

		for (int i = 0; i < users.size(); i++)
			System.out.println(i + users.get(i).getCompanyName());
		
	}
}

cfile26.uf.183E69224AB1F4DC9FC5DB.zip