伪代码如下:

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)相关推荐

  1. 解密android日志xlog,XLog 详解及源码分析

    一.前言 这里的 XLog 不是微信 Mars 里面的 xLog,而是elvishew的xLog.感兴趣的同学可以看看作者 elvishwe 的官文史上最强的 Android 日志库 XLog.这里先 ...

  2. Android 9(P)之init进程启动源码分析指南之一

         Android 9 之init进程启动源码分析指南之一 Android 9 (P) 系统启动及进程创建源码分析目录: Android 9 (P)之init进程启动源码分析指南之一 Andro ...

  3. Android 9 (P)之init进程启动源码分析指南之三

          Android 9 (P)之init进程启动源码分析指南之三 Android 9 (P)系统启动及进程创建源码分析目录: Android 9 (P)之init进程启动源码分析指南之一 An ...

  4. 【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. ...

  5. AFL二三事——源码分析

    AFL二三事--源码分析 前言 AFL,全称"American Fuzzy Lop",是由安全研究员Michal Zalewski开发的一款基于覆盖引导(Coverage-guid ...

  6. Dubbo系列(二)源码分析之SPI机制

    Dubbo系列(二)源码分析之SPI机制 在阅读Dubbo源码时,常常看到 ExtensionLoader.getExtensionLoader(*.class).getAdaptiveExtensi ...

  7. Android 8.1/9.0 MTK Camera源码分析之录像快门声音控制流程

    前面已经针对拍照快门声音控制流程进行了分析,接下来分析一下录像快门声音的控制流程. Android 8.1/9.0 MTK Camera源码分析之快门声音控制流程 这两篇文章其实都是相对于手机系统RO ...

  8. Android 8.1/9.0 MTK Camera源码分析之快门声音控制流程

    Android 8.1/9.0 MTK Camera源码分析之快门声音控制 在Android 8.1上mtk camera有控制快门声音的接口,但是并没有了控制录像快门声音的接口.之所以会有这个现象, ...

  9. 【Android Protobuf 序列化】Protobuf 使用 ( Protobuf 源码分析 | 创建 Protobuf 对象 )

    文章目录 一.Protobuf 源码分析 二.创建 Protobuf 对象 三.完整代码示例 四.参考资料 一.Protobuf 源码分析 Protobuf 源文件如下 : addressbook.p ...

  10. 【C++】Android (Light)RefBase-sp-wp引用计数-智能指针源码分析

    文章目录 1.RefBase简介 2.RefBase源码分析 3.RefBase使用注意事项 4.总结 1.RefBase简介 什么是RefBase?RefBase是Android中的一个C++类,用 ...

最新文章

  1. java 读取流的字符编码格式_如何使用Java代码获取文件、文件流或字符串的编码方式...
  2. STM32中stm32f0xx_flash.icf文件的作用详解!
  3. 通过Java代码打开浏览器,本地文件目录以及ftp站点
  4. 现代软件工程讲义 12 绩效管理
  5. Linux虚拟化KVM-Qemu分析(二)之ARMv8虚拟化
  6. CKEditor快速介绍与入门示例
  7. 论文笔记--跨模态间的人脸与人名对齐方法研究-2012
  8. jquery字符串转json
  9. 计算机硬件驱动备份,驱动备份还原软件工具
  10. 软件测试p1是什么级别,软件测试工程师岗位等级-20210729101938.doc-原创力文档
  11. VMware ESXi 7.0 U2 SLIC Unlocker USB 网卡驱动集成镜像
  12. 「Injective衍生品市场创意大赛」角逐“最强王者”,就等你来
  13. Material Design实战
  14. Securecrt 配色方案
  15. GA-RPN:Region Proposal by Guided Anchoring
  16. linux mysql5.7免安装版配置_MySQL5.7免安装版配置
  17. 论混合软件架构的设计
  18. 7-10 将输入的字符串中的字符头尾间隔输出
  19. 4G IoT设备开发,一板搞定
  20. 手机号码归属地查询免费api接口代码

热门文章

  1. 人工智能数学基础---定积分3:微积分基本公式(牛顿-莱布尼茨公式)
  2. MacOS删除开机启动项
  3. 关于分布函数连续性的运用
  4. 谷歌大脑 2016 年机器学习的 9 大进展,今年将大放异彩
  5. 模似html元素tilte提示
  6. MongoDB学习笔记
  7. 阿里云华为云对比分析
  8. 格力集团投资小米,或是对董明珠和格力电器的复仇
  9. 一年月份大小月口诀_农历大小月卦口诀详解(最新版).doc
  10. 什么是NFC,NFC和RFID对比有什么区别?