在团队开发过程中,写出优雅的代码是一件很重要的事情,这就要求在写码时,注重代码的可读性,可扩展性和灵活性等等;因此熟练运用设计模式是一个优秀程序员必须要掌握的技能。最近又回过头来认真看《大话设计模式》一书,对其中内容的理解也的确和第一次草草阅读完全不一样了。所以计划整理一下,将自己对每种模式的理解写成学习笔记。
面向对象编程很重要的三点就是“封装”,“继承”和“多态” 的灵活运用;这三点是保证代码低耦合非常重要的因素。比如在写android时,在我的理解中,从大的方面讲写android 无非就是在做两件事,一个是数据处理,一个是数据展现;所以一个好的app的业务代码一定保证了数据处理和数据展现这两者的低耦合。
因此,为了能做到上述的代码的灵活性, 可扩展性以及低耦合性等等,许许多多的优秀的设计模式就应运而生了。
今天抽空把 “简单工厂模式” 以 android 小程序的形式实践了一下。简单理解就是创建一个唯一的调度类来管理多态,比如实际生活中很多餐厅服务员在给顾客点菜时用的点菜宝 就是这么一个调度中心,点菜宝用过简单输入菜名来启动这道菜的制作流程,做完后由服务员端上给顾客即可,服务员并不需要知道这道菜是如何制作加工的。
每一个计算类,都继承自一个计算基类,代码如下:
工程结构截图如下:
面向对象编程很重要的三点就是“封装”,“继承”和“多态” 的灵活运用;这三点是保证代码低耦合非常重要的因素。比如在写android时,在我的理解中,从大的方面讲写android 无非就是在做两件事,一个是数据处理,一个是数据展现;所以一个好的app的业务代码一定保证了数据处理和数据展现这两者的低耦合。
因此,为了能做到上述的代码的灵活性, 可扩展性以及低耦合性等等,许许多多的优秀的设计模式就应运而生了。
今天抽空把 “简单工厂模式” 以 android 小程序的形式实践了一下。简单理解就是创建一个唯一的调度类来管理多态,比如实际生活中很多餐厅服务员在给顾客点菜时用的点菜宝 就是这么一个调度中心,点菜宝用过简单输入菜名来启动这道菜的制作流程,做完后由服务员端上给顾客即可,服务员并不需要知道这道菜是如何制作加工的。
同样,本例中以一个计算器为例,也是以简单工厂模式来实现的。
主界面如上图所示就是一个简单的计算界面。MainActivity 的代码如下:
public class MainActivity extends Activity {
private EditText editTextNum1;
private EditText editTextNum2;
private Spinner spinnerOperator;
private Button btnCalculate;
private TextView txtResult;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView(){
editTextNum1 = (EditText) findViewById(R.id.num1);
editTextNum2 = (EditText) findViewById(R.id.num2);
spinnerOperator = (Spinner) findViewById(R.id.operate_spinner);
btnCalculate = (Button) findViewById(R.id.btn_calculate);
txtResult = (TextView) findViewById(R.id.txt_result);
btnCalculate.setOnClickListener(new OnBtnCalculateOnClickListener());
}
class OnBtnCalculateOnClickListener implements View.OnClickListener{
@Override
public void onClick(View view) {
txtResult.setText(getCalculateResult());
}
}
public String getCalculateResult(){
int num1 = 0;
int num2 = 0;
String operator = "+";
if(editTextNum1 != null) {
num1 = Integer.valueOf(editTextNum1.getText().toString().trim());
}
if(editTextNum2 != null) {
num2 = Integer.valueOf(editTextNum2.getText().toString().trim());
}
if(spinnerOperator != null){
operator = (String) spinnerOperator.getSelectedItem();
}
Calculate calculate = CalculateFactory.getCalculateType(MainActivity.this, operator);
if(calculate == null){
return "operator error";
}
calculate.num1 = num1;
calculate.num2 = num2;
return calculate.getResult();
}
}
可见MainActivity 中 函数 getCalculateResult 中的CalculateFactory类 就是一个计算类型工厂,我只需要传入运算符即可得到对应运算符的运算结果。
CalculateFactory类 代码如下,比较容易理解:
public class CalculateFactory {
public static Calculate getCalculateType(Context context, String operator) {
Calculate calculate = null;
switch (operator) {
case "+":
calculate = new AddCalculate(context);
break;
case "-":
calculate = new SubtractCalculate(context);
break;
case "*":
calculate = new MultiplyCalculate(context);
break;
case "/":
calculate = new DivideCalculate(context);
break;
case "^":
calculate = new ExponentCalculate(context);
break;
default:
break;
}
return calculate;
}
}
每一个计算类,都继承自一个计算基类,代码如下:
public class ExponentCalculate extends Calculate {
public ExponentCalculate(Context context) {
super(context);
}
@Override
public String getResult() {
if (num1 == 0) {
Toast.makeText(contextWeakReference.get(), "num1 is illegal in ExponentCalculate", Toast.LENGTH_SHORT).show();
return "number entered illegal";
} else if (num2 == 0) {
Toast.makeText(contextWeakReference.get(), "num2 is illegal in ExponentCalculate", Toast.LENGTH_SHORT).show();
return "number entered illegal";
} else {
float result = num1;
while (num2-- >= 0) {
result = result * num1;
}
return String.valueOf(result);
}
}
}
工程结构截图如下:
简单工厂模式 也称 静态工厂模式,它很好诠释了面向对象编程的三大要素:封装,继承和多态。使代码有了良好的灵活性和可扩展性~