Android 最常用的设计模式二 安卓源码分析——组合模式(component)
伪代码如下:
public void testComponent(){Composite root = new Composite("服装--根节点"); Composite c1 = new Composite("男装-----一级子节点1"); Composite c2 = new Composite("女装-----一级子节点2"); Leaf leaf1 = new Leaf("衬衫------二级子节点1"); Leaf leaf2 = new Leaf("夹克------二级子节点2"); Leaf leaf3 = new Leaf("裙子------二级子节点3"); Leaf leaf4 = new Leaf("套装------二级子节点4"); root.addChild(c1); root.addChild(c2); c1.addChild(leaf1); c1.addChild(leaf2); c1.addChild(leaf3); c1.addChild(leaf4); c2.addChild(leaf1); c2.addChild(leaf2); c2.addChild(leaf3); c2.addChild(leaf4); //所有的服装的消费记录 root.paycard(""); }
public class Composite implements IComponent {/** * 用来存储组合对象中包含的子组件对象 */ private List<IComponent> childComponents = new ArrayList<IComponent>(); /** * 组合对象的名字 */ private String name; /** * 构造方法,传入组合对象的名字 * @param name 组合对象的名字 */ public Composite(String name){this.name = name; }/** * 聚集管理方法,增加一个子构件对象 * @param child 子构件对象 */ public void addChild(IComponent child){childComponents.add(child); }/** * 聚集管理方法,删除一个子构件对象 * @param index 子构件对象的下标 */ public void removeChild(int index){childComponents.remove(index); }/** * 聚集管理方法,返回所有子构件对象 */ public List<IComponent> getChild(){return childComponents; }/** * 输出对象的自身结构 * @param preStr 前缀,主要是按照层级拼接空格,实现向后缩进 */ @Override public void paycard(String preStr) {// 先把自己输出 System.out.println(preStr + "+" + this.name); //如果还包含有子组件,那么就输出这些子组件对象 if(this.childComponents != null){//添加两个空格,表示向后缩进两个空格 preStr += " "; //输出当前对象的子对象 for(IComponent c : childComponents){//递归输出每个子对象 c.paycard(preStr); }}} }
public class Leaf implements IComponent {/** * 叶子对象的名字 */ private String name; /** * 构造方法,传入叶子对象的名称 * @param name 叶子对象的名字 */ public Leaf(String name){this.name = name; }/** * 输出叶子对象的结构,叶子对象没有子对象,也就是输出叶子对象的名字 * @param preStr 前缀,主要是按照层级拼接的空格,实现向后缩进 */ @Override public void paycard(String preStr) {// TODO Auto-generated method stub System.out.println(preStr + "-" + name); }}
public interface IComponent {/** * 输出组建自身的名称 */ public void paycard(String preStr); }
总结:
- Component:抽象节点,为组合中的对象声明接口,适当的时候实现所有类的公有接口方法的默认行为。
- Composite:可以是根节点,定义所有枝干节点的行为,存储子节点,添加节点,删除节点,实现相关操作(继承Component)。
- Leaf:叶子节点,没有子节点,实现相关对象的行为(继承Component)。
实例和场景分析:
那么我们就根据我们会员卡的消费,来模拟一下组合模式的实现吧!let's go!
首先:
1.我们的部件有,总店,分店,加盟店!
2.我们的部件共有的行为是:刷会员卡
3.部件之间的层次关系,也就是店面的层次关系是,总店下有分店、分店下可以拥有加盟店。
有了我们这几个必要条件后,我的要求就是目前店面搞活动当我在总店刷卡后,就可以累积相当于在所有下级店面刷卡的积分总额,设计的代码如下:
这样在累积所有子店面积分的时候,就不需要去关心子店面的个数了,也不用关系是否是叶子节点还是组合节点了,也就是说不管是总店刷卡,还是加盟店刷卡,都可以正确有效的计算出活动积分。
public void testMarket(){MarketBranch rootMarket=new MarketBranch("总店"); MarketBranch shenBranch=new MarketBranch("深圳分店"); MarketJoin marketJoin1=new MarketJoin("深圳南山加盟店"); MarketJoin marketJoin2=new MarketJoin("深圳福田加盟店"); rootMarket.add(shenBranch); shenBranch.add(marketJoin1); shenBranch.add(marketJoin2); rootMarket.PayByCard(); }
public class MarketBranch extends Market {public MarketBranch(String name){this.name=name; }// 加盟店列表 List<Market> list = new ArrayList<Market>(); @Override public void add(Market m) {list.add(m); }@Override public void remove(Market m) {list.remove(m); }// 消费之后,该分店下的加盟店自动累加积分 @Override public void PayByCard() {System.out.println(name + "消费,积分已累加入该会员卡"); for (Market m : list) {m.PayByCard(); }} }
/** * Created by Administrator on 2017/9/14. * 加盟店 */ public class MarketJoin extends Market{public MarketJoin(String name){this.name=name; }@Override public void add(Market m) {}@Override public void remove(Market m) {}@Override public void PayByCard() {}}
/** * Created by Administrator on 2017/9/14. * 店 */ public abstract class Market {String name; public abstract void add(Market m); public abstract void remove(Market m); public abstract void PayByCard(); }
形象比喻:
COMPOSITE—Mary今天过生日。“我过生日,你要送我一件礼物。”
“嗯,好吧,去商店,你自己挑。”
“这件T恤挺漂亮,买,
这条裙子好看,买,
这个包也不错,买。”“
喂,买了三件了呀,我只答应送一件礼物的哦。”
“什么呀,T恤加裙子加包包,正好配成一套呀,小姐,麻烦你包起来。
”“……”,MM都会用Composite模式了,你会了没有?
View和ViewGroup类的使用。在android UI设计,几乎所有的widget和布局类都依靠这两个类。
ViewGroup是容纳这些组件的容器,其本身也是从View派生出来的
可见,作为容器的ViewGroup可以包含作为叶子节点的View
也可以包含作为更低层次的子ViewGroup
而子ViewGroup又可以包含下一层的叶子节点的View和ViewGroup
那就是View和ViewGroup类的使用。在android UI设计,几乎所有的widget和布局类都依靠这两个类。
1.意图
将对象View和ViewGroup组合成树形结构以表示"部分-整体"的层次结构(View可以做为ViewGroup的一部分)。
组合模式使得用户对单个对象View和组合对象ViewGroup的使用具有一致性。
热点词汇: 部分-整体 容器-内容 树形结构 一致性 叶子 合成 安全性 透明性
我们选择安全式的组合模式(在组合对象中添加add,remove,getChild方法),
public abstract class ViewGroup extends View implements ViewParent, ViewManager {private static final String TAG = "ViewGroup"; private static final boolean DBG = false; /** @hide */ public static boolean DEBUG_DRAW = false;
public void addView(View child, int index) {if (child == null) {throw new IllegalArgumentException("Cannot add a null child view to a ViewGroup"); }LayoutParams params = child.getLayoutParams(); if (params == null) {params = generateDefaultLayoutParams(); if (params == null) {throw new IllegalArgumentException("generateDefaultLayoutParams() cannot return null"); }}addView(child, index, params); }
public View getChildAt(int index) {if (index < 0 || index >= mChildrenCount) {return null; }return mChildren[index]; }
ViewManager:
public interface ViewManager {/** * Assign the passed LayoutParams to the passed View and add the view to the window. * <p>Throws {@link android.view.WindowManager.BadTokenException} for certain programming * errors, such as adding a second view to a window without removing the first view. * <p>Throws {@link android.view.WindowManager.InvalidDisplayException} if the window is on a * secondary {@link Display} and the specified display can't be found * (see {@link android.app.Presentation}). * @param view The view to be added to this window. * @param params The LayoutParams to assign to view. */ public void addView(View view, ViewGroup.LayoutParams params); public void updateViewLayout(View view, ViewGroup.LayoutParams params); public void removeView(View view); }
用的场合
1.ViewPager:添加和移除:一个容器
2.悬浮窗:添加和移除
3.数据库:增删改查
代码和demo:不知道为什么上传不上去
参考博客:
http://blog.csdn.net/hp910315/article/details/51111478
Android 最常用的设计模式二 安卓源码分析——组合模式(component)相关推荐
- 解密android日志xlog,XLog 详解及源码分析
一.前言 这里的 XLog 不是微信 Mars 里面的 xLog,而是elvishew的xLog.感兴趣的同学可以看看作者 elvishwe 的官文史上最强的 Android 日志库 XLog.这里先 ...
- Android 9(P)之init进程启动源码分析指南之一
Android 9 之init进程启动源码分析指南之一 Android 9 (P) 系统启动及进程创建源码分析目录: Android 9 (P)之init进程启动源码分析指南之一 Andro ...
- Android 9 (P)之init进程启动源码分析指南之三
Android 9 (P)之init进程启动源码分析指南之三 Android 9 (P)系统启动及进程创建源码分析目录: Android 9 (P)之init进程启动源码分析指南之一 An ...
- 【Android CameraX】CameraXBasic —— 官方CameraX实例源码分析
一.简介 二.源码分析 2.1 build.gradle 2.2 代码结构 2.3 变量 2.3.1 lensFacing 2.3.2 preview 2.3.3 Image capture 2.3. ...
- AFL二三事——源码分析
AFL二三事--源码分析 前言 AFL,全称"American Fuzzy Lop",是由安全研究员Michal Zalewski开发的一款基于覆盖引导(Coverage-guid ...
- Dubbo系列(二)源码分析之SPI机制
Dubbo系列(二)源码分析之SPI机制 在阅读Dubbo源码时,常常看到 ExtensionLoader.getExtensionLoader(*.class).getAdaptiveExtensi ...
- Android 8.1/9.0 MTK Camera源码分析之录像快门声音控制流程
前面已经针对拍照快门声音控制流程进行了分析,接下来分析一下录像快门声音的控制流程. Android 8.1/9.0 MTK Camera源码分析之快门声音控制流程 这两篇文章其实都是相对于手机系统RO ...
- Android 8.1/9.0 MTK Camera源码分析之快门声音控制流程
Android 8.1/9.0 MTK Camera源码分析之快门声音控制 在Android 8.1上mtk camera有控制快门声音的接口,但是并没有了控制录像快门声音的接口.之所以会有这个现象, ...
- 【Android Protobuf 序列化】Protobuf 使用 ( Protobuf 源码分析 | 创建 Protobuf 对象 )
文章目录 一.Protobuf 源码分析 二.创建 Protobuf 对象 三.完整代码示例 四.参考资料 一.Protobuf 源码分析 Protobuf 源文件如下 : addressbook.p ...
- 【C++】Android (Light)RefBase-sp-wp引用计数-智能指针源码分析
文章目录 1.RefBase简介 2.RefBase源码分析 3.RefBase使用注意事项 4.总结 1.RefBase简介 什么是RefBase?RefBase是Android中的一个C++类,用 ...
最新文章
- java 读取流的字符编码格式_如何使用Java代码获取文件、文件流或字符串的编码方式...
- STM32中stm32f0xx_flash.icf文件的作用详解!
- 通过Java代码打开浏览器,本地文件目录以及ftp站点
- 现代软件工程讲义 12 绩效管理
- Linux虚拟化KVM-Qemu分析(二)之ARMv8虚拟化
- CKEditor快速介绍与入门示例
- 论文笔记--跨模态间的人脸与人名对齐方法研究-2012
- jquery字符串转json
- 计算机硬件驱动备份,驱动备份还原软件工具
- 软件测试p1是什么级别,软件测试工程师岗位等级-20210729101938.doc-原创力文档
- VMware ESXi 7.0 U2 SLIC Unlocker USB 网卡驱动集成镜像
- 「Injective衍生品市场创意大赛」角逐“最强王者”,就等你来
- Material Design实战
- Securecrt 配色方案
- GA-RPN:Region Proposal by Guided Anchoring
- linux mysql5.7免安装版配置_MySQL5.7免安装版配置
- 论混合软件架构的设计
- 7-10 将输入的字符串中的字符头尾间隔输出
- 4G IoT设备开发,一板搞定
- 手机号码归属地查询免费api接口代码