android设计模式 模板模式,Android设计模式-模版方法模式

1.定义

定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

2.模版方法模式UML图

76598a6883fb

模版方法模式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类型的方法,重写改变其具体逻辑,这种方式也叫钩子函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值