组合模式之拼凑的美好

廊坊的风一如既往的在窗外刮着,天地间肆意地飘洒,纵情在一刹那,为何如今仅仅剩下风吹乱我的发,乱蓬蓬的,还是去超市逛逛吧,买吃的`(*∩_∩*)′,走进华联超市,热情的店员招呼着我,開始为我介绍,推荐各种各样商品,店员向我推荐了他们的会员卡,全场全部项目均八折,每逢节假日打五折,我心想那太划算了,并且他们总店,分店,加盟店都能够用,所以就办了张会员卡。今天我们的设计模式就从超市会员卡開始说起。

这个俨然就是我们设计模式中的组合模式----组合模式有时候又叫做部分-总体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序能够向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。看以下的两幅图片:

 
          

上面两幅图片我们能够看做是一个文件结构,对于这种结构我们称之为树形结构。在《大话设计模式》中我们了解到能够通过调用某个方法来遍历整个树,当我们找到某个叶子节点后,就能够对叶子节点进行相关的操作。我们能够将这颗树理解成一个大的容器,容器里面包括非常多的成员对象,这些成员对象就可以是容器对象也能够是叶子对象。可是因为容器对象和叶子对象在功能上面的差别,使得我们在使用的过程中必需要区分容器对象和叶子对象,可是这样就会给客户带来不必要的麻烦,对于客户而言,始终希望能够一致的对待容器对象和叶子对象。这就是组合模式的设计动机:组合模式定义了怎样将容器对象和叶子对象进行递归组合,使得客户在使用的过程中无须进行区分,能够对他们进行一致的处理。以下一起来看一下组合模式的结构图:

以上述在华联超市办会员卡为例,看看组合模式是怎样在代码中实现:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication3
{
class Program
{
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();
}
}

/// <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)
{ }

public override void Remove(Storefront store)
{ }
}

}

 
     
 组合模式的目的是:让client不再区分操作的是组合对象还是叶子对象,而是以一个统一的方式来操作。实现这个目标的关键之处,是设计一个抽象的组件类,让它能够代表组合对象和叶子对象。这样一来,client就不用区分究竟是组合对象还是叶子对象了,仅仅须要所有当成组件对象进行统一的操作就能够了。

组合模式之拼凑的美好,布布扣,bubuko.com

时间: 2024-08-09 21:58:49

组合模式之拼凑的美好的相关文章

[js高手之路]设计模式系列课程-组合模式+寄生组合继承实战新闻列表

所谓组合模式,就是把一堆结构分解出来,组成在一起,现实中很多这样的例子,如: 1.肯德基套餐就是一种组合模式, 比如鸡腿堡套餐,一般是是由一个鸡腿堡,一包薯条,一杯可乐等组成的 2.组装的台式机同理,由主板,电源,内存条,显卡, 机箱,显示器,外设等组成的 把一个成型的产品组成部件,分成一个个独立的部件,这种方式可以做出很多灵活的产品,这就是组合模式的优势 比如:家用台式机电脑,要求配置比较低, 这个时候只需要主板+电源+内存条+机箱+显示器+外设就可以了,不需要配置独立显卡 鸡腿堡+鸡翅+紫薯

组合模式(Composite)

一.组合模式介绍 组合模式:将对象组合成树形结构以表示:部分--整体 的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. java中的组合是指:在A类里定义一个B类的引用,A拥有了B,叫组合.只是单纯的组合而已,而不是一种设计模式. 组合和组合模式不是一回事! 基本上见到的树形结构都使用到了组合模式. 组合模式结构图: 组合模式中有几个核心的部分: Leaf(叶子):表示该节点下面没有其他子节点了,就称为叶子 Compostie(容器构件):容器构件,该节点下还有其他子节点,理解

10.设计模式_组合模式

转载自   http://www.cnblogs.com/zhili/p/CompositePattern.html 一.引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象和复合对象在功能上区别,导致在操作过程中必须区分简单对象和复合对象,这样就会导致客户调用带来不必要的麻烦,然而作为客户,它们希望能够始终一致地对待简单对象和复合对象.然而组合模式就是

Java设计模式应用——组合模式

组合模式实际上是一种树形数据结构.以windows目录系统举例,怎么样用java语言描述一个文件夹? 定义一个文件夹类,文件夹类中包含若干个子文件类和若干个文件类. 进一步抽象,把文件夹和文件都看做节点,于是一个文件夹就可以描述为一个节点类,包含若干个子节点. 我们看看组合模式的代码 // 抽象节点 public abstract class Node { protected String name; abstract void add(Node node); abstract void rem

设计模式 -- 组合模式(Composite)

写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------主要内容包括: 初识组合模式,包括:定义.结构.参考实现 体会组合模式,包括:场景问题.不用模式的解决方案.使用模式的解决方案 理解组合模式,包括:认识组合模式.安全性和透明性.父组件引用.环状引用.组合模式的优缺点 思考组合模式,包括:组合模式的本质.何时选用 参考内容: 1.<研磨设计模式> 一书,作者:陈臣.王斌 --

11 组合模式

组合模式(Composite)定义:将对象组合成树形结构以表示"部分-整体"的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. UML类图如下: 比如<大话>中举的例子,公司总部在北京,然后在南京.杭州设有办事处,总公司和分支办事处都有相似的组织结构,比如都有人力资源部.财务部等.如下图: 再有HeadFirst举的关于菜单的例子,如下图: 如果程序需要表达上面例子中的公司层级组织或是菜单层级的结构,就可以采用组合模式. 组合模式能让我们用树形方式创建对象的

php中的组合模式

刚看完了<深入php面向对象.模式与实践>一书中组合模式这块内容,为了加深理解和记忆,所以着手写了这篇博客. 为方便后续理解,此处先引入两个概念,局部对象和组合对象. 局部对象:无法将其他对象组合到自身内部属性上的对象.即不能组合其他对象的对象. 组合对象:可以将其他对象组合到自身内部属性上的对象.即可以组合其他对象的对象. 注:将对象A的某个属性中存储着对象B对象的引用,则表示A与B有组合关系,其中A将B组合到了自身内部. 首先我们通过给出下面的业务需求,来引入组合模式: 业务部门想要开发一

设计模式学习笔记(十五:组合模式)

1.1概述 将对象组合成树形结构以表示"部分-整体"的层次结构.组合(Composite)使用户对单个对象和组合对象的使用具有一致性.这就是组合模式的定义. 如果一个对象包含另一个对象的引用,称这样的对象为组合对象.如果将当前组合对象作为一个整体的话,那么它所包含的对象就是该整体的一部分.如果一个对象不含有其他对象的引用,称这样的对象为个体对象.在编写程序时,我们希望将许多个体对象和组合对象组成树形结构,以此表示"部分-整体"的层次结构,并借助该层次结构使得用户能用

javascript设计模式学习之十——组合模式

一.组合模式定义及使用场景 组合模式将对象组合成树形结构,用以表示“部分—整体”的层次结构,除了用来表示树形结构之外,组合模式还可以利用对象的多态性表现,使得用户对单个对象和组合对象的使用具有一致性. 实现组合模式的关键: 在java等静态语言中,需要单个对象和组合对象都实现同样的抽象接口,这可以通过抽象类或者接口来实现. 在javascript中,对象的多态性是与生俱来的,没有编译器去检查对象的类型,因此实现组合模式的要点是保证组合兑现个单个对象用友同样的方法,这通常需要使用“鸭子类型”的思想