Android框架设计模式(一)——Template Methods

本文介绍了Android框架设计中的模板方法模式,探讨了如何通过该模式将不变部分内置,变化部分留给应用实现,以降低耦合度并增强拓展性。文章分析了模板方法在Android框架中的应用,并给出了Java和Android中的实例,揭示了其在消除重复代码和构建框架中的作用。
摘要由CSDN通过智能技术生成

引言


这两天开始学习高焕堂老师的Android的设计模式,感觉他的讲解非常透彻,把Android框架和设计模式结合讲解,在Android这个大而全的体系框架中,从整体上把握设计模式的应用,感觉对Android框架设计的理解加深了许多,希望以后能够同步学习进度,记录和分享学习心得。
我个人的理解,说到模式就离不开框架,设计模式和框架就是虚实的两面,就像武功心法和招式的关系一样。设计模式就类似于心法(虚),而框架就类似于招式(实),心法是教你在什么时候应该运用什么方法,以及如何运用才能发挥最好的效果,招式就是将心法运用在实战修炼当中得到的具体套路,有了套路才能以不变应万变,每一个招式都有一个固定的使用情景。从另一方面来说,模式(Template、Factory、State等)是一些专家针对一系列经常出现的问题所提炼出来的抽象解决思想;框架就是针对于某一个具体的使用环境(Android、Windows等),用以解决特殊领域的具体问题的。总的来说,框架是模式在特定的领域的具体实现。所以我觉得需要把模式的讲解放到具体的框架当中才能够加深理解。

一、框架


  • 基本思维:

    【变与不变之分离】,将【变化】的部分作为接口留给应用实现,将【不变】的部分在框架内部实现。不同的开发人员实现不同的【变化】,便组成了形形色色的APP了。 ——高焕堂

  • 框架分为两类
    1. 白盒框架:采取继承机制实现,当程序编译时,编译程序建立框架类与应用类之间的沟通(继承机制)。白盒框架因为有编译器帮助,所以比较容易设计,而且藉由继承机制能够有效的减轻程序的开发复杂度,结构清晰;缺点是由于应用类和框架类是继承关系,故而两者的依赖程度较高,独立性较差,不易修改和拓展。

    2. 黑盒框架:采取接口机制实现,通过实现接口的双向引用来达到双向沟通的目的。黑盒框架能够有效的隐藏框架的内部实现机制,减少框架与应用的耦合程度。缺点是实现的结构复杂,运行前需要检查各个组件是否实现了双向接通。

  • 实现工具和机制(设计模式同理):
    1. 卡榫函数:框架与应用程序之间的接口。框架通过卡榫函数来实现对应用类别的控制(调用应用类别的设计代码),从而实现应用框架与应用类时间的沟通。
    2. IOC(控制反转):也称“依赖倒置”,框架主导组件的装配和修饰(加载框架内部属性、程序员定义代码部分)。框架定义了接口而子类实现接口,框架上调用子类的接口(子类只负责实现这个接口的不同形式,从而形成不同的应用),从而将控制主权交给框架,实现控制反转。
  • Android中的框架

    这里写图片描述

    Android框架的实现结合了白盒和黑盒的方式,至于具体实现的方式和原理,可以参考高焕堂老师的《Google Android应用框架原理与程序设计36计》。以后学到了,再继续分享。

三、Template Methods


简介:模板方法模式是设计框架的核心之一,把【不变】的部分放在框架内部,把【变化】部分留给应用类别实现。消除重复和公共的代码,使得子类在不改变一个框架结构前提下重新定义框架的某些特定可变部分。
UML图示:

这里写图片描述


应用场景:
  1. 框架搭建(配合IOC机制实现)
  2. 消除代码重复
java范例:

目标:使用Template Method实现一个画弧线的小程序。

  • 结构

    这里写图片描述

  • 代码

    • Shape类——框架部分
    • Bird类——应用部分
    • Jpanel、JFrame——界面接口部分
import java.awt.*; 
public abstract class Shape{  public void template_paint(Graphics gr){      
   // 画天空背 景          
   gr.setColor(Color.black);   
   gr.fillRect(10,30, 200,100);        
   // 画前景 
   hook_paint(gr); 
}    
protected abstract void hook_paint(Graphics gr); 
} 
import java.awt.*; public class Bird extends Shape {
     @Override  public void hook_paint(Graphics gr){     
// 画图(弧线)指令 
   gr.setColor(Color.cyan);     
   gr.drawArc(30,80,90,110,40,100);        
   gr.drawArc(88,93,90,100,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值