Foggy day
Android(Java) - composite design pattern example 본문
This post is the example of composite design pattern without detail explanation.
If you know definition or concept of composite design pattern, I recommend searching other articles on Google.
Some explanations are commented out in the code.
Classes used
1. AbstractExpression
abstract public class AbstractExpression {
public abstract int operate();
}
2. AbstractOperationExpression
abstract public class AbstractOperationExpression extends AbstractExpression {
protected ArrayList<AbstractExpression> operandList = new ArrayList<>();
public final void addOperandExpression(AbstractExpression operandExpression){
operandList.add(operandExpression);
}
}
3. NumberExpression
public class NumberExpression extends AbstractExpression {
private int value;
public NumberExpression(int value) {
this.value = value;
}
@Override
public int operate() {
return value;
}
}
4. Calculator
public class Calculator {
private AbstractExpression expression;
public void setExpression(AbstractExpression expression) {
this.expression = expression;
}
public Calculator() {
super();
}
public int calculate() {
return expression.operate();
}
}
5. AddOperationExpression
public class AddOperationExpression extends AbstractOperationExpression{
@Override
public int operate() {
AbstractExpression firstOperandExpression = operandList.get(0);
AbstractExpression secondOperandExpression = operandList.get(1);
int firstResult = firstOperandExpression.operate();
int secondResult = secondOperandExpression.operate();
return firstResult + secondResult;
}
}
6. SubtractOperationExpression
public class SubtractOperationExpression extends AbstractOperationExpression {
@Override
public int operate() {
AbstractExpression firstOperandExpression = operandList.get(0);
AbstractExpression secondOperandExpression = operandList.get(1);
int firstResult = firstOperandExpression.operate();
int secondResult = secondOperandExpression.operate();
return firstResult - secondResult;
}
}
7. MultiplyOperationExpression
public class MultiplyOperationExpression extends AbstractOperationExpression{
@Override
public int operate() {
AbstractExpression firstOperandExpression = operandList.get(0);
AbstractExpression secondOperandExpression = operandList.get(1);
int firstResult = firstOperandExpression.operate();
int secondResult = secondOperandExpression.operate();
return firstResult * secondResult;
}
}
8. DivideOperationExpression
public class DivideOperationExpression extends AbstractOperationExpression {
@Override
public int operate() {
AbstractExpression firstOperandExpression = operandList.get(0);
AbstractExpression secondOperandExpression = operandList.get(1);
int firstResult = firstOperandExpression.operate();
int secondResult = secondOperandExpression.operate();
return firstResult / secondResult;
}
}
9. CompositeClientJava
public class CompositeClientJava extends CommonActivity {
private static final String TAG = "CompositeClientJava";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.composite_client_java);
Calculator calculator = new Calculator();
int firstNumber = 100;
int secondNumber = 20;
//NumberExpression is Class that save a value and is used to parameter
NumberExpression firstNumberEquation = new NumberExpression(firstNumber);
NumberExpression secondNumberEquation = new NumberExpression(secondNumber);
//The variable type of setExpression method is AbstractExpression class.
//Because NumberExpression extends AbstractExpression class, it can be used as a parameter of setExpression function
calculator.setExpression(firstNumberEquation);
Log.d(TAG, "onCreate: firstNumber : " + calculator.calculate());
calculator.setExpression(secondNumberEquation);
Log.d(TAG, "onCreate: secondNumberEquation : " + calculator.calculate());
//AddOperationExpression class extends AbstractOperationExpression class.
//Upcast AddOperationExpression to AbstractOperationExpression
AbstractOperationExpression addOperationExpression = new AddOperationExpression();
//parameter type of addOperandExpression function is AbstractExpression class.
//If call addOperandExpression function, the value is added to operandList in AbstractOperationExpression class
addOperationExpression.addOperandExpression(firstNumberEquation);
addOperationExpression.addOperandExpression(secondNumberEquation);
//Now, you can get calculated results using calculator class
calculator.setExpression(addOperationExpression);
Log.d(TAG, "onCreate: add Result : " + calculator.calculate());
AbstractOperationExpression subtractOperationExpression = new SubtractOperationExpression();
subtractOperationExpression.addOperandExpression(firstNumberEquation);
subtractOperationExpression.addOperandExpression(secondNumberEquation);
calculator.setExpression(subtractOperationExpression);
Log.d(TAG, "onCreate: subtract result : " + calculator.calculate());
AbstractOperationExpression multiplyOperationExpression = new MultiplyOperationExpression();
multiplyOperationExpression.addOperandExpression(firstNumberEquation);
multiplyOperationExpression.addOperandExpression(secondNumberEquation);
calculator.setExpression(multiplyOperationExpression);
Log.d(TAG, "onCreate: multiply result : " + calculator.calculate());
AbstractOperationExpression divideOperationExpression = new DivideOperationExpression();
divideOperationExpression.addOperandExpression(firstNumberEquation);
divideOperationExpression.addOperandExpression(secondNumberEquation);
calculator.setExpression(divideOperationExpression);
Log.d(TAG, "onCreate: divide result : " + calculator.calculate());
}
}
result
'Android' 카테고리의 다른 글
Android(Java, kotlin) - Appbar Animation with ViewPager inside Fragment (0) | 2020.12.29 |
---|---|
Android Custom View: Extending The Views (0) | 2020.12.27 |
Android(kotlin) - custom circle progressBar (0) | 2020.12.27 |
Android - 최고의 커스텀 뷰 가이드 (0) | 2020.12.27 |
Android(Kotlin) - FlexibleViewPagerHeight when you want to apply wrapContent to viewPager (0) | 2020.12.26 |