`
leoyu
  • 浏览: 12048 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

第五个设计模式:合成模式

阅读更多
 第五个设计模式:合成模式
合成模式把部分和整体关系用树结构表示,是属于对象的结构模式。合成模式要对组合的对象进行管理,所以在一定位置给予对象的相关管理方法,如:add(),remove()等.合成模式中对象的管理有两种方案。
1.安全方式:此方式只允许树枝构件有对象的管理方法。
2.透明方式:此方式只允许树枝和树叶都有对象的管理方法,但树叶对象中的管理方法无实际意义。
一.UML示意图
二.组成部分
抽象构件:抽象组合对象的公共行为接口
树叶构件:树叶对象,没有下级子对象
树枝构件:树枝对象,树枝对象可以包含一个或多个其他树枝或树叶对象
三.代码例子:我以一个超市购物为例
(一)、安全方式
1.抽象物品(抽象构件)
package com.eekq.structure.composite.security;
/*
 * 抽象构件,物品
 * */
public interface IRes {
    /**购物买单,示意性的商业方法*/
    public void pay();
}
2.单一物品(树叶构件)
package com.eekq.structure.composite.security;
public class SingleResImpl implements IRes {
    /**物品名称*/
    private String name;
    /**价钱*/
    private float money;
    public SingleResImpl(String name, float money) {
        this.name = name;
        this.money = money;
    }
    public void pay() {
        System.out.println("购买了一件物品["+getName()+"],价钱是[" + getMoney()+"]元");
    }
    public float getMoney() {
        // TODO 自动生成方法存根
        returnthis.money;
    }
    public String getName() {
        // TODO 自动生成方法存根
        return this.name;
    }  
    /**重写equals*/
    public boolean equals(Object obj){
        SingleResImpl res = (SingleResImpl)obj;    
        return res.getName().equals(getName()) && res.getMoney()==getMoney();
    }
}
3.多个物品(树枝构件)
package com.eekq.structure.composite.security;
import java.util.Iterator;
import java.util.Vector;
/*
 * 对多个物品的管理
 * */
public class MultiResImpl implements IRes {
    /**购物车*/
    private Vector car = new Vector();
    private static float totle = 0.0f;
     
public void pay() {
        if(!car.isEmpty()){
        System.out.println("名称        价格\n");
        shopping();
        System.out.println("\n总价:" + totle + "元");
        }else{
            System.out.println("您好,你没有购买任何物品,不用买单!");       
        }
    }
    public void shopping() {      
        if (car != null || !car.isEmpty()) {
            Iterator it = car.iterator();
            SingleResImpl res = null;
            Object temp = null;// 临时对象
            while (it.hasNext()) {
                temp = it.next();
                if (temp instanceof MultiResImpl) {
                    ((MultiResImpl) temp).shopping();
                } else {
                    res = (SingleResImpl) temp;
                    synchronized (this) {
                        totle += res.getMoney();
                    }
                    System.out.println(res.getName() + "            " + res.getMoney()
                            + "元");
                }
            }
        }
    }
    /**加入新的物品*/
    public void addRes(IRes res) {
        car.add(res);
    }
 
    /**放回物品*/
    public void removeRes(IRes res) {
        car.remove(res);
    }
 
}
 
4.收银台买单
package com.eekq.structure.composite.security;
public class Main {
    /**
     *@paramargs
     */
    public static void main(String[] args) {
        /**买支雪糕*/
        IRes singleRes = new SingleResImpl("雪糕", 1.5f);
        /**买单*/
        singleRes.pay();
 
        /**快过年了,我推了个购物车,多买点东西*/
        IRes allRes = new MultiResImpl();              
        /**在一楼买的食物*/
        IRes one = new MultiResImpl();
        ((MultiResImpl) allRes).addRes(one);//把一楼的东西装在购物车里
        /**因为是安全方式的组合模式,因此不够透明,只能明确的向下转型,然后再加入购物车了*/
        ((MultiResImpl) one).addRes(new SingleResImpl("旺旺", 28.5f));
        ((MultiResImpl) one).addRes(new SingleResImpl("糖果", 38.0f));
        ((MultiResImpl) one).addRes(new SingleResImpl("可乐", 8.5f));
 
        /**二楼去买的衣服和袜子*/
        IRes two = new MultiResImpl();
        ((MultiResImpl) allRes).addRes(two);// 把二楼的东西装也装在购物车里
        ((MultiResImpl) two).addRes(new SingleResImpl("衣服", 130.5f));
        ((MultiResImpl) two).addRes(new SingleResImpl("袜子", 10f));       
        /**二楼再买了个手表,我放在bao里*/
        IRes bao = new MultiResImpl();
        ((MultiResImpl) two).addRes(bao);//把购物小包装在二楼购物车里
        ((MultiResImpl) bao).addRes(new SingleResImpl("手表", 100f));
       
        /**回到一楼,又买了苹果和梨*/
        ((MultiResImpl) one).addRes(new SingleResImpl("苹果", 10.0f));
        ((MultiResImpl) one).addRes(new SingleResImpl("梨", 3.0f));
/**在买单之前我把可乐退了,因为家里还有的嘛*/
        ((MultiResImpl) one).removeRes(new SingleResImpl("可乐", 8.5f));
        /**在收银台一次性对购物车所有物品买单*/
        allRes.pay();
    }
}
 
5.运行结果
购买了一件物品[雪糕],价钱是[1.5]元
名称        价格
 
旺旺        28.5元
糖果        38.0元
苹果        10.0元
          3.0元
衣服        130.5元
袜子        10.0元
手表        100.0元
 
总价:320.0元
 
(二)、透明方式
透明方式与安全方式的不同点在于抽象构件,透明方式使用的是统一接口。
1. 抽象构件
package com.eekq.structure.composite.clarity;
 
/*
 * 抽象构件,物品
 * */
public interface IRes {
    /**购物买单,示意性的商业方法*/
    public void pay();
 
    /**加入新的物品*/
    public void addRes(IRes res);
 
    /**放回物品*/
    public void removeRes(IRes res);
}
2. 单一物品(树叶构件)
package com.eekq.structure.composite.security;
 
public class SingleResImpl implements IRes {
 
    /**物品名称*/
    private String name;
 
    /**价钱*/
    private float money;
 
    public SingleResImpl(String name, float money) {
        this.name = name;
        this.money = money;
    }
 
    public void pay() {
        System.out.println("购买了一件物品["+getName()+"],价钱是[" + getMoney()+"]元");
    }
 
    public float getMoney() {
        // TODO 自动生成方法存根
        return this.money;
    }
 
    public String getName() {
        // TODO 自动生成方法存根
        return this.name;
    }
   
    /**重写equals*/
    public boolean equals(Object obj){
        SingleResImpl res = (SingleResImpl)obj;    
        return res.getName().equals(getName()) && res.getMoney()==getMoney();
    }
 
}
3.多个物品(树枝构件)
同安全模式代码一样!
4.收银台买单
 
package com.eekq.structure.composite.clarity;
public class Main {
    /**
     *@paramargs
     */
    public static void main(String[] args) {
        /**买支雪糕*/
        IRes singleRes = new SingleResImpl("雪糕", 1.5f);
        /**买单*/
        singleRes.pay();
        /**快过年了,我推了个购物车,多买点东西*/
        IRes allRes = new MultiResImpl();
 
        /**在一楼买的食物*/
        IRes one = new MultiResImpl();
        allRes.addRes(one);// 把一楼的东西装在购物车里
        /**因为是透明方式的组合模式,因此直接调用就是了*/
        one.addRes(new SingleResImpl("旺旺", 28.5f));
        one.addRes(new SingleResImpl("糖果", 38.0f));
        one.addRes(new SingleResImpl("可乐", 8.5f));
 
        /**二楼去买的衣服和袜子*/
        IRes two = new MultiResImpl();
        allRes.addRes(two);// 把二楼的东西装也装在购物车里
        two.addRes(new SingleResImpl("衣服", 130.5f));
        two.addRes(new SingleResImpl("袜子", 10f));
        /**二楼再买了个手表,我放在bao里*/
        IRes bao = new MultiResImpl();
        two.addRes(bao);// 把购物小包装在二楼购物车里
        bao.addRes(new SingleResImpl("手表", 100f));
        /**回到一楼,又买了苹果和梨*/
        one.addRes(new SingleResImpl("苹果", 10.0f));
        one.addRes(new SingleResImpl("梨", 3.0f));
        /**在买单之前我把可乐退了,因为家里还有的嘛*/
        one.removeRes(new SingleResImpl("可乐", 8.5f));
        /**在收银台一次性对购物车所有物品买单*/
        allRes.pay();
    }
}
5.运行结果
同安全模式一样的结果!
四.总结
合成模式是对象的结构模式,以上演示合成模式。在以后的项目中,如果遇到对象组合的情况,即也符合树结构的。可以考虑下此模式。此模式中讲述了安全方式和透明方式。
安全方式:抽象构件上只提供树叶和树枝公共的方法,没提供树枝独有的管理等方法(add(),remove())。这样的好处是安全,用户不会在树叶上使用add()等管理方法,缺点是不够透明,用户必须知识当前对象为树叶还是树枝(向下转型)。
透明方式:抽象构件上提供了满足树枝的所有方法(包括add(),remove()),这样做的好处是,用户可以任意执行对象的add()和remove()管理对象。缺点是如果用户在树叶上执行管理方式(add(),remove())时,在编译期不会有错,但在执行期会报错,这样不容易被发觉错误出在哪.
作者:飞行鱼 QQ:6868861 推荐J2EE群:7715552


 

分享到:
评论

相关推荐

    C#23种设计模式_示例源代码及PDF

    合成模式:合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式就 合成模式 是一个处理对象的树结构的模式。 合成模式把部分与整体的关系用树结构表示出来。 合成模 式使得客户端把一个个单独的...

    [Java设计模式(第2版)(Design.Patterns.in.Java).John.Metsker

    第5章 合成(composite)模式 39 第6章 桥接(bridge)模式 52 第7章 职责型模式介绍 62 第8章 单例(singleton)模式 67 第9章 观察者(observer)模式 72 第10章 调停者(mediator)模式 85 第11章 代理(proxy)模式 97 第12...

    《设计模式实训教程》【PPT+类图与代码+样章】

    3.1.1设计模式 3.1.2创建型模式概述 3.1.3简单工厂模式 3.1.4工厂方法模式 3.1.5抽象工厂模式 3.1.6建造者模式 3.1.7原型模式 3.1.8单例模式 3.2实训实例 3.2.1简单工厂模式实例之图形工厂 3.2.2工厂方法...

    吉林大学软件学院卓班设计模式第二次作业

    c) 合成一个新的字符图像后,新图像不会含有关于”合成过程”的信息,即新图像不知道是通过水平连接得到的,还是垂直连接得到的,也不会知道“左子图”是什么等。 为此,重新设计了CharPic(为方便对比,类名改为Pic)...

    《Java设计模式(第2版)》

    二、设计模式遵循的原则有6个: 1、开闭原则(Open Close Principle) 对扩展开放,对修改关闭。 2、里氏代换原则(Liskov Substitution Principle) 只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,...

    Java与模式(清晰书签版) 设计模式 part3

    第5章 专题 JAVA语言的接口 第6章 专题 抽象类 第7章 里氏代换原则 第8章 依赖倒转原则 第9章 接口隔离原则 第10章 合成、聚合复用原则 第11章 迪米特法则 第12章 简单工厂模式 第13章 工厂方法模式 第14章 抽象工厂...

    Delphi模式编程第一分卷

    第5章 抽象工厂模式(Abstract Factory) 5.1 模式解说 5.2 结构和用法 5.2.1 模式结构 5.2.2 代码模板 5.3 范例与实践 5.3.1 用抽象工厂模式动态构造界面风格 5.3.2 WebSnap的Web Module架构与抽象工厂模式 ...

    Delphi模式编程第二分卷

    第5章 抽象工厂模式(Abstract Factory) 5.1 模式解说 5.2 结构和用法 5.2.1 模式结构 5.2.2 代码模板 5.3 范例与实践 5.3.1 用抽象工厂模式动态构造界面风格 5.3.2 WebSnap的Web Module架构与抽象...

    Delphi 深度探索(第二版)〖含随书光盘源代码〗

    第5章 vcl深度探索 5.1 action开发之七种武器 5.2 vcl拖放高级应用 5.3 高级停靠技术的实现 5.4 面向对象的界面复用技术 5.5 vcl中的容器类 5.6 所见即所得的delphiweb开发利器--intraweb开发指南 5.7...

    java简易投票系统源码下载-DesignModeDemo:23种设计模式swift实现

    一、设计模式七大原则(有些地方使用六大原则,没有第六调,此处主要是总结,用于学习) 1、单一职责原则 一个类只负责一个功能领域中的相应职责 2、里氏替换原则 任何基类可以出现的地方,子类一定可以出现 3、依赖...

    直接数字频率合成+白居宪编著 淘宝买的,网上找不到

    第5章 低噪声微波频率合成器的设计原理 5.1 微波环路的基本框图 5.2 微波环路中的加性噪声 5.3 用环路滤波器改善输出噪声 5.4 微波频率合成举例 5.4.1 超低噪声微波频率合成器 5.4.2 雷达和通信系统中的低噪声频率...

    Java与模式(含示例代码)

    第5 章 专题:Java 语言的接口........59 5.1 什么是接口...................................59 5.2 为什么使用接口...........................60 5.3 Java 接口常见的用法...................63 第6 章 专题:...

    ads2008射频电路设计与仿真实例05

    第5章 低噪声放大电路设计 5.1 低噪声放大器设计理论基础 5.1.1 低噪声放大器在通信系统中的作用 5.1.2 低噪声放大器的主要技术指标 5.1.3 低噪声放大器的设计方法 5.2 LNA设计实例 5.2.1 下载并安装晶体管的库文件...

    网吧管理系统数据库课程设计.doc

    4 数据库关系图 第4章 数据库物理结构设计 第5章 数据库完整性设计 5。1 主键及唯一性索引 5.2 参照完整性设计 5.3 Check约束 5.5 触发器设计 第6章 数据库视图设计 第7章 数据库存储过程设计 第8章 权限设计 ...

    DBX260中文说明书

    260 DriveRack单元自出厂时就带有25个精心设计路径结构的厂家程序,它们完美的适合于任何扩声及固定安装应用。这些配置是以一种直观的直接的方法处于260上的。260显示出从输入部分至输出部分整个的信号路径。 ...

    超级有影响力霸气的Java面试题大全文档

    当客户机第一次调用一个Stateful Session Bean 时,容器必须立即在服务器中创建一个新的Bean实例,并关联到客户机上,以后此客户机调用Stateful Session Bean 的方法时容器会把调用分派到与此客户机相关联的Bean实例...

    无线覆盖设计方案.docx

    XXXXX 数字常规对讲机覆盖系统 无线覆盖设计方案 数字常规对讲机覆盖系统 技术方案 设计单位:武汉易达通科技发展有限公司 2015年7月 无线覆盖设计方案全文共10页,当前为第1页。 无线覆盖设计方案全文共10页,当前...

    射频与微波功率放大器设计

    第5章 功率合成器、阻抗变换器和定向耦合器 5.1基本特性 5.2三口网络 5.3四口网络 5.4同轴电缆变换器和合成器 5.5 wilkinson功率分配器 5.6微波混合桥 5.7耦合线定向耦合器 参考文献 第6章 功率放大器设计基础 6.1...

    ads2008射频电路设计与仿真实例(03,04,06)

    第5章 低噪声放大电路设计 5.1 低噪声放大器设计理论基础 5.1.1 低噪声放大器在通信系统中的作用 5.1.2 低噪声放大器的主要技术指标 5.1.3 低噪声放大器的设计方法 5.2 LNA设计实例 5.2.1 下载并安装晶体管的库文件...

Global site tag (gtag.js) - Google Analytics