UML关系简单介绍
UML简单使用的介绍
创建型设计模式
Android设计模式-单例模式
Android设计模式-工厂模式
Android设计模式-抽象工厂模式
Android设计模式-建造者模式
Android设计模式-原型模式
结构型设计模式
Android设计模式-代理模式
Android设计模式-装饰模式
Android设计模式-适配器模式
Android设计模式-组合模式
Android设计模式-门面模式
Android设计模式-桥接模式
Android设计模式-享元模式
行为型设计模式
Android设计模式-策略模式
Android设计模式-命令模式
Android设计模式-责任链模式
Android设计模式-模版方法模式
Android设计模式-迭代器模式
Android设计模式-观察者模式
Android设计模式-备忘录模式
Android设计模式-中介者模式
Android设计模式-访问者模式
Android设计模式-状态模式
Android设计模式-解释器模式
1.定义
定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
2.模版方法模式UML图
角色介绍
- AbstractClass 抽象模版,也就是抽象类。。 定义了一套具体步骤(也就是模版方法)。拥有基本方法和模版方法,基本方法就是由子类实现的方法,并且在模版方法中调用。
- ConcreteClass 具体类 实现抽象类,并可具体修改某些步骤,即基本方法。
为了防止子类的修改,一般都会给模版方法加上final修饰
抽象模版中的基本方法最好设置为protected类型,不需要暴露的属性和方法尽量不要设置为protected类型。实现类若非必要,尽量不要扩大父类中的访问权限。
简单实现
抽象模版
public abstract class AbstractClass {
protected abstract void m1();
protected abstract void m2();
protected abstract void m3();
public final void doMethod(){
m1();
m2();
m3();
}
}
具体实现类
public class ConcreteClass1 extends AbstractClass {
@Override
protected void m1() {
System.out.println("先进行步骤a");
}
@Override
protected void m2() {
System.out.println("先进行步骤b");
}
@Override
protected void m3() {
System.out.println("先进行步骤c");
}
}
public class ConcreteClass2 extends AbstractClass {
@Override
protected void m1() {
System.out.println("先进行步骤c");
}
@Override
protected void m2() {
System.out.println("先进行步骤a");
}
@Override
protected void m3() {
System.out.println("先进行步骤b");
}
}
客户端调用
public class MyClass {
public static void main(String args[]) {
AbstractClass class1=new ConcreteClass1();
class1.doMethod();
System.out.println("----------");
AbstractClass class2=new ConcreteClass2();
class2.doMethod();
}
}
打印结果
先进行步骤a
先进行步骤b
先进行步骤c
----------
先进行步骤c
先进行步骤a
先进行步骤b
其实模版方法也就是简单用到了类的继承,当然实现上也不是必须修改具体的方法才能修改具体执行顺序,也可以在抽象类中的模版方法内,添加返回值为boolean类型的方法进行判断,然后子类中重写这种方法,也就能做到子类间接控制父类模版方法内的执行顺序。
4.总结
4.1优点
- 封装不变部分,扩展可变部分,把认为是不变的部分封装进父类中,可变部分通过继承在子类中进行重写。
- 便于维护,因为具体的代码提取到了父类中,而不是具体的子类,这样也就不用到处找了。
- 行为由父类控制,具体由子类实现,符合开闭原则
4.2缺点
- 往常中,抽象类中都是声明一些最抽象最一般的属性和方法,然后在子类中具体实现。而模版方法中,则进行了颠倒,只抽象了部分方法由子类实现,且子类实现可影响到父类的运行逻辑,但是算是缺点吗。。。好像也不算。。毕竟封装一些基类的时候也经常用到。。
4.3使用场景
- 多个子类由公用的方法,并且逻辑基本相同
- 重要复杂的算法,可以把核心算法设计模版方法,周边的相关细节功能由子类具体实现。
- 重构时,模版方法是一个经常会被用到的方法,把相同的代码抽入到父类中,然后通过子类实现约束其行为,就像上面类似返回值为boolean类型的方法,重写改变其具体逻辑,这种方式也叫钩子函数。