package com.cheng.zenofdesignpatterns.patterns.templatemethod;
import android.view.View;
import com.cheng.zenofdesignpatterns.ZoDPChapterBaseActivity;
import com.cheng.zenofdesignpatterns.patterns.templatemethod.common.AbstractClass;
import com.cheng.zenofdesignpatterns.patterns.templatemethod.common.ConcreteClass1;
import com.cheng.zenofdesignpatterns.patterns.templatemethod.common.ConcreteClass2;
import com.cheng.zenofdesignpatterns.patterns.templatemethod.hookmethod.HMHummerH1Model;
import com.cheng.zenofdesignpatterns.patterns.templatemethod.hookmethod.HMHummerH2Model;
import com.cheng.zenofdesignpatterns.patterns.templatemethod.section1.HummerH1Model;
import com.cheng.zenofdesignpatterns.patterns.templatemethod.section1.HummerModel;
public class ZoDPTemplateMethodActivity extends ZoDPChapterBaseActivity {
@Override
protected void initData() {
mTitleTV.setText("模板方法模式");
String content = "定义:\n" +
"Define the skeleton of an algorithm in an operation,deferring some steps " +
"to subclasses.Template Method lets subclasses redefine certain steps of " +
"an algorithm without changing the algorithm's structure.\n" +
"定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个" +
"算法的结构即可重定义该算法的某些特定步骤。\n\n" +
"模板方法模式的优点\n" +
"封装不变部分,扩展可变部分\n" +
"- 把认为是不变的部分的算法封装到父类实现,而可变部分的则可以通过继承来继续扩展\n" +
"- 提取公共部分代码,便于维护\n" +
"- 行为由父类控制,子类实现\n" +
"模板方法模式的缺点\n" +
"按照我们的设计习惯,抽象类负责声明最抽象、最一般的事务属性和方法,实现类完成具体\n" +
"的事物属性和方法。但是模板方法模式却颠倒了,抽象类定义了部分抽象方法,由子类实现,\n" +
"子类执行的结果影响了父类的结果,也就是子类对父类产生了影响,这在复杂的项目中,会\n" +
"带来代码阅读的难度,而且也会让新手产生不适感。\n\n" +
"使用场景\n" +
"- 多个子类有公有的方法,并且逻辑基本相同时\n" +
"- 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现\n" +
"- 重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过" +
"钩子函数约束其行为\n\n" +
"最佳实践\n" +
"模板方法在一些开源框架中应用非常多,它提供了一个抽象类,然后开源框架写了一堆子类。\n" +
"在《xxx In Action》中就说明了,如果你需要扩展功能,可以继承这个抽象类,然后覆写\n" +
"protected方法,再然后就是调用一个类似execute方法,就完成你的扩展开发,非常容易\n" +
"扩展的一种模式。";
mContentTV.setText(content);
}
@Override
public void onClick(View v) {
// 1. Section1
//牛叉公司要H1型号的悍马
HummerModel h1 = new HummerH1Model();
//H1模型演示
h1.run();
// 2. 通用模板方法模式演示
AbstractClass class1 = new ConcreteClass1();
AbstractClass class2 = new ConcreteClass2();
//调用模版方法
class1.templateMethod();
class2.templateMethod();
// 3. 钩子方法演示
System.out.println("-------H1型号悍马--------");
System.out.println("H1型号的悍马是否需要喇叭声响?0-不需要 1-需要");
String type = "1";
HMHummerH1Model h11 = new HMHummerH1Model();
if(type.equals("0")){
h11.setAlarm(false);
}
h11.run();
System.out.println("\n-------H2型号悍马--------");
HMHummerH2Model h22 = new HMHummerH2Model();
h22.run();
}
}