突然间想到了一个模式,跟现在的场景很合适,名字叫《组合模式》,为什么说跟组合模式很相似呢?

先看看组合模式的定义吧,在《大话设计模式一书中》组合模式的定义为:“将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

那就拿我剪发办卡的事情来分析一下吧。

首先,一张卡可以在总部,分店,×××店使用,那么总部可以刷卡,分店也可以刷卡,×××店也可以刷卡,这个属性结构的店面层级关系就明确啦。

那么,总店刷卡消费与分店刷卡消费是一样的道理,那么总店与分店对会员卡的使用也具有一致性。

1.组合模式的例子

组合模式结构图:

那么组合模式的实例如下:

//抽象的部件类描述将来所有部件共有的行为

public abstract class Component

{

protected string name;

public string Name

{

get

{

return name;

}

set

{

name = value;

}

}

//添加部件

public abstract void Add(Component component);

//删除部件

public abstract void Remove(Component component);

//遍历所有子部件

public abstract void eachChild();

}

//组合部件类

public class Leaf : Component

{

//叶子节点不具备添加的能力,所以不实现

public override void Add(Component component)

{

throw new NotImplementedException();

}

//叶子节点不具备添加的能力必然也不能删除

public override void Remove(Component component)

{

throw new NotImplementedException();

}

//叶子节点没有子节点所以显示自己的执行结果

public override void eachChild()

{

Console.WriteLine("{0}执行了..",name);

}

}

//组合类

public class Composite : Component

{

//用来保存组合的部件

List<Component> myList = new List<Component>();

//添加节点 添加部件

public override void Add(Component component)

{

myList.Add(component);

}

//删除节点 删除部件

public override void Remove(Component component)

{

myList.Remove(component);

}

//遍历子节点

public override void eachChild()

{

Console.WriteLine("{0}执行了..", name);

foreach (Component c in myList)

{

c.eachChild();

}

}

}

static void Main(string[] args)

{

//构造根节点

Composite rootComponent = new Composite();

rootComponent.Name = "根节点"

//添加两个叶子几点,也就是子部件

Leaf l = new Leaf();

l.Name = "叶子节点一"

Leaf l1 = new Leaf();

l1.Name = "叶子节点二"

rootComponent.Add(l);

rootComponent.Add(l1);

//遍历组合部件

rootComponent.eachChild();

}

运行结果如下:

2.应用组合模式的会员卡消费

那么我们就根据我们会员卡的消费,来模拟一下组合模式的实现吧!let's go!

首先:

1.我们的部件有,总店,分店,×××店!

2.我们的部件共有的行为是:刷会员卡

3.部件之间的层次关系,也就是店面的层次关系是,总店下有分店、分店下可以拥有×××店。

有了我们这几个必要条件后,我的要求就是目前店面搞活动当我在总店刷卡后,就可以累积相当于在所有下级店面刷卡的积分总额,设计的代码如下:

/// <summary> /// 店面类 抽象出来的店面部件

/// </summary>

public abstract class Storefront

{

//店名

protected string storeName = string.Empty;

public string StoreName

{

get

{

return storeName;

}

}

//添加店面

public abstract void Add(Storefront store);

//删除店面

public abstract void Remove(Storefront store);

//定义所有部件公用的行为 刷卡行为

public abstract void PayByCard();

}

public class StoreOrBranch : Storefront

{

//构造函数

public StoreOrBranch() { }

public StoreOrBranch(string storeName)

{

this.storeName = storeName;

}

List<Storefront> myStoreList = new List<Storefront>();

//刷卡消费

public override void PayByCard()

{

Console.WriteLine("店面{0}的积分已累加进该会员卡", storeName);

foreach (Storefront sf in myStoreList)

{

sf.PayByCard();

}

}

//增加店面

public override void Add(Storefront store)

{

myStoreList.Add(store);

}

//解除店面

public override void Remove(Storefront store)

{

myStoreList.Remove(store);

}

}

public class JoinInStore : Storefront

{

//构造函数

public JoinInStore() { }

public JoinInStore(string storeName)

{

this.storeName = storeName;

}

//刷卡消费

public override void PayByCard()

{

Console.WriteLine("店面{0}的积分已累加进该会员卡", storeName);

}

public override void Add(Storefront store)

{

throw new NotImplementedException();

}

public override void Remove(Storefront store)

{

throw new NotImplementedException();

}

}

static void Main(string[] args)

{

StoreOrBranch store = new StoreOrBranch("朝阳总店");

StoreOrBranch brach = new StoreOrBranch("东城分店");

JoinInStore jstore = new JoinInStore("海淀×××店一");

JoinInStore jstore1 = new JoinInStore("上地×××店二");

brach.Add(jstore);

brach.Add(jstore1);

store.Add(brach);

store.PayByCard();

}

运行结果如下:

这样在累积所有子店面积分的时候,就不需要去关心子店面的个数了,也不用关系是否是叶子节点还是组合节点了,也就是说不管是总店刷卡,还是×××店刷卡,都可以正确有效的计算出活动积分。

3.什么情况下使用组合模式

引用大话设计模式的片段:“当发现需求中是体现部分与整体层次结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑组合模式了。”

转载于:https://blog.51cto.com/cangshi004/781472

从理发流程想到的组合设计模式相关推荐

  1. python3 最基本且简单的实现组合设计模式

    组合模式是把一个类别归为一个整体,并且组织多个整体之间的关系,使用通过树形结构来描述所有整体. 一般的编写方式为一个类别对象下添加多个该对象的元素,该对象又为其它对象下的元素.简单来说就是一个学校有一 ...

  2. python实现组合问题_python3 最基本且简单的实现组合设计模式

    组合模式是把一个类别归为一个整体,并且组织多个整体之间的关系,使用通过树形结构来描述所有整体. 一般的编写方式为一个类别对象下添加多个该对象的元素,该对象又为其它对象下的元素.简单来说就是一个学校有 ...

  3. 12【组合设计模式】

    文章目录 十二.组合设计模式 12.1 组合设计模式简介 12.1.1 组合设计模式概述 12.1.2 组合设计模式中的角色 12.2 组合设计模式的实现 12.2.1 透明组合模式 12.2.2 安 ...

  4. t-sql执行结果_用于记录流程执行的T-SQL设计模式

    t-sql执行结果 介绍 (Introduction) Context 语境 Back in my days at school, I followed a course entitled " ...

  5. Java设计模式(十一):组合设计模式

    1. 应用场景 这种组合模式正是应树形结构而生,所以组合模式的使用场景就是出现树形结构的地方.比如:文件目录显示,多及目录呈现等树形结构数据的操作. 2. 概念 将对象组合成树形结构来表示" ...

  6. GOF设计模式之组合设计模式(结构型模式) ✨ 每日积累

    组合模式是什么 组合模式(Composite Pattern),又叫部分整体模式,作为结构型模式,组合模式是用于把一组相似的对象当作一个单一的对象.组合多个对象形成树形结构来表示"整体-部分 ...

  7. Java,Android,窥探组合的用法。AndroidUI组合设计模式,Java组合设计模式

    package com.panda.android.pattern; /**测试类*/ public class Client {public static void main(String args ...

  8. 击鼓传花java_击鼓传花联想到了Java设计模式:责任链模式

    应用场景 http web请求处理,请求过来后将经过转码.解析.参数封装.鉴权等一系列的处理(责任),而且要经过多少处理是可以灵活调整的 那么该怎么做呢? 将所有的处理都写在一个类中行不行呢? 分成多 ...

  9. Java组合设计模式

    在继承的子类中,可以把父类中允许的访问控制成员变量和方法进行再次的改造,这在一定程度破坏了Java面向对象的封装.而且在Java中继承是一种单继承的存在. 如果需要在一个类中,获取其他类(一个或多个) ...

最新文章

  1. 为什么智能车竞赛没有清华学生参加比赛呢?
  2. ASP.NET中常用功能代码总结(5)——文件操作篇
  3. Thread.sleep() SystemClock.sleep()
  4. linux修改vim配色,更改vim配色的具体操作 更改vim配色的图文教程
  5. python3爬虫初探(二)之requests
  6. react-router-dom@6获取路由传参
  7. MySQL安装时出现的问题
  8. 充实你的素材库!10款免费的 PSD 素材下载
  9. hdu1251(trie树)
  10. cvpr2019 文章
  11. cisco交换机端口“假死”现象
  12. 几种常见的基于Lucene的开源搜索解决方案对比
  13. JAVA核心技术36讲教程
  14. linux -IOMMU
  15. Matlab_textscan用法教程1_从指定行读取数据
  16. leetcode每日一题-字符串中的第一个唯一字符
  17. Visual C++网络编程经典案例详解 第9章 实用播放器 编程基础 播放mp3文件 读取文件
  18. Civil 3D菜单栏不在了怎么办
  19. 解决MySQL CPU占用100%的经验总结 转
  20. 回溯算法 允许重复选择元素的组合

热门文章

  1. 学习报告21-02-28
  2. python爬取饿了么奶茶店外卖数据_一家奶茶店如何在外卖平台提高销量?
  3. 2014工作一年的感悟与总结
  4. Element el-color-picker 颜色选择器详解
  5. java 初级、中级、高级工程师等 如何区分?
  6. 微型真空泵的可靠性问题
  7. Echart自定义tooltip带小圆点
  8. Silverlight 2.5D RPG游戏技巧与特效处理:(八)无限缩放空间系统
  9. c++网络五子棋Linux版
  10. 使用ESP8266,基于Alios things 的linkkit连接阿里生活物联网平台,实现天猫精灵控制