`
zhangwei_david
  • 浏览: 468509 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java 设计模式-合成模式(Composite)

阅读更多

    合成模式(Composite)是一组对象的组合,这些对象可以是容器对象,表现为组的概念;另外一些对象则代表了单个对象,称为叶子对象。
     组对象可以包含叶子对象也可以包含其他组对象。组对象和叶子对象定义相同的行为。
 
   合成模式(Composite)的意图就是为了保证客户端调用单对象和调用组合对象的一致性,也就需要组合对象和单个对象需要共享同一个接口。
   在对组合对象建模时,为了防止死循环,可以确保组合对象都是树形结构。

     有一个对象模型需要校验,是用合成模式的校验的结果是:

 

 

 

Java代码
  1. /** 
  2.  * 
  3.  * @author Lenovo 
  4.  * @version $Id: RemitModel.java, v 0.1 2014年9月24日 下午5:03:53 Lenovo Exp $ 
  5.  */  
  6. public class RemitModel {  
  7.   
  8.     private PayeeModel payeeModel;  
  9.   
  10.     private String     remark;  
  11.   
  12.     private String     bankAccount;  
  13.   
  14.     /** 
  15.      * Getter method for property <tt>payeeModel</tt>. 
  16.      * 
  17.      * @return property value of payeeModel 
  18.      */  
  19.     public PayeeModel getPayeeModel() {  
  20.         return payeeModel;  
  21.     }  
  22.   
  23.     /** 
  24.      * Setter method for property <tt>payeeModel</tt>. 
  25.      * 
  26.      * @param payeeModel value to be assigned to property payeeModel 
  27.      */  
  28.     public void setPayeeModel(PayeeModel payeeModel) {  
  29.         this.payeeModel = payeeModel;  
  30.     }  
  31.   
  32.     /** 
  33.      * Getter method for property <tt>remark</tt>. 
  34.      * 
  35.      * @return property value of remark 
  36.      */  
  37.     public String getRemark() {  
  38.         return remark;  
  39.     }  
  40.   
  41.     /** 
  42.      * Setter method for property <tt>remark</tt>. 
  43.      * 
  44.      * @param remark value to be assigned to property remark 
  45.      */  
  46.     public void setRemark(String remark) {  
  47.         this.remark = remark;  
  48.     }  
  49.   
  50.     /** 
  51.      * Getter method for property <tt>bankAccount</tt>. 
  52.      * 
  53.      * @return property value of bankAccount 
  54.      */  
  55.     public String getBankAccount() {  
  56.         return bankAccount;  
  57.     }  
  58.   
  59.     /** 
  60.      * Setter method for property <tt>bankAccount</tt>. 
  61.      * 
  62.      * @param bankAccount value to be assigned to property bankAccount 
  63.      */  
  64.     public void setBankAccount(String bankAccount) {  
  65.         this.bankAccount = bankAccount;  
  66.     }  
  67.   
  68. }  
  69. /** 
  70.  * 
  71.  * @author Lenovo 
  72.  * @version $Id: PayeeModel.java, v 0.1 2014年9月24日 下午5:32:38 Lenovo Exp $ 
  73.  */  
  74. public class PayeeModel {  
  75.   
  76.     private String payeeBankAccount;  
  77.   
  78.     /** 
  79.      * Getter method for property <tt>payeeBankAccount</tt>. 
  80.      * 
  81.      * @return property value of payeeBankAccount 
  82.      */  
  83.     public String getPayeeBankAccount() {  
  84.         return payeeBankAccount;  
  85.     }  
  86.   
  87.     /** 
  88.      * Setter method for property <tt>payeeBankAccount</tt>. 
  89.      * 
  90.      * @param payeeBankAccount value to be assigned to property payeeBankAccount 
  91.      */  
  92.     public void setPayeeBankAccount(String payeeBankAccount) {  
  93.         this.payeeBankAccount = payeeBankAccount;  
  94.     }  
  95.   
  96. }  
 
Java代码
  1. /** 
  2.  * 校验器 
  3.  * @author Lenovo 
  4.  * @version $Id: Validator.java, v 0.1 2014年9月24日 下午5:01:40 Lenovo Exp $ 
  5.  */  
  6. public interface Validator {  
  7.     /** 
  8.      * 是否含有子节点 
  9.      * 
  10.      * @return 
  11.      */  
  12.     public boolean hasChild();  
  13.   
  14.     /** 
  15.      * 校验数据 
  16.      * 
  17.      * @param remitModel 
  18.      * @return 
  19.      */  
  20.     public boolean validate(RemitModel remitModel);  
  21.   
  22.     /** 
  23.      * 添加子校验器 
  24.      * 
  25.      * @param validator 
  26.      */  
  27.     public void addValidator(Validator validator);  
  28.   
  29. }  
  30. import java.util.ArrayList;  
  31. import java.util.List;  
  32.   
  33. /** 
  34.  * 
  35.  * @author Lenovo 
  36.  * @version $Id: RemitModelValidator.java, v 0.1 2014年9月24日 下午5:05:25 Lenovo Exp $ 
  37.  */  
  38. public class RemitModelValidator implements Validator {  
  39.   
  40.     private List<Validator> children = new ArrayList<Validator>();  
  41.   
  42.     /** 
  43.      * @see com.cathy.demo.pattern.composite.Validator#validate(com.cathy.demo.pattern.composite.RemitModel) 
  44.      */  
  45.     public boolean validate(RemitModel remitModel) {  
  46.         if (hasChild()) {  
  47.             for (Validator validator : children) {  
  48.                 if (!validator.validate(remitModel)) {  
  49.                     System.out.println("校验失败");  
  50.                     return false;  
  51.                 }  
  52.                 System.out.println("--");  
  53.             }  
  54.         }  
  55.         System.out.println("校验通过");  
  56.         return true;  
  57.     }  
  58.   
  59.     /** 
  60.      * @see com.cathy.demo.pattern.composite.Validator#hasChild() 
  61.      */  
  62.     public boolean hasChild() {  
  63.         return !children.isEmpty();  
  64.     }  
  65.   
  66.     /** 
  67.      * @see com.cathy.demo.pattern.composite.Validator#addValidator(com.cathy.demo.pattern.composite.Validator) 
  68.      */  
  69.     public void addValidator(Validator validator) {  
  70.         children.add(validator);  
  71.     }  
  72.   
  73. }  
  74.   
  75. import java.util.ArrayList;  
  76. import java.util.List;  
  77.   
  78. /** 
  79.  * 
  80.  * @author Lenovo 
  81.  * @version $Id: PayeeValidator.java, v 0.1 2014年9月24日 下午5:20:06 Lenovo Exp $ 
  82.  */  
  83. public class PayeeValidator implements Validator {  
  84.   
  85.     private List<Validator> children = new ArrayList<Validator>();  
  86.   
  87.     /** 
  88.      * @see com.cathy.demo.pattern.composite.Validator#hasChild() 
  89.      */  
  90.     public boolean hasChild() {  
  91.         return !children.isEmpty();  
  92.     }  
  93.   
  94.     /** 
  95.      * @see com.cathy.demo.pattern.composite.Validator#validate(com.cathy.demo.pattern.composite.RemitModel) 
  96.      */  
  97.     public boolean validate(RemitModel remitModel) {  
  98.         if (hasChild()) {  
  99.             for (Validator validator : children) {  
  100.                 if (!validator.validate(remitModel)) {  
  101.                     System.out.println("校验失败");  
  102.                     return false;  
  103.                 }  
  104.                 System.out.println("**");  
  105.             }  
  106.         }  
  107.         System.out.println("收款人校验通过");  
  108.         return true;  
  109.     }  
  110.   
  111.     /** 
  112.      * @see com.cathy.demo.pattern.composite.Validator#addValidator(com.cathy.demo.pattern.composite.Validator) 
  113.      */  
  114.     public void addValidator(Validator validator) {  
  115.         children.add(validator);  
  116.     }  
  117.   
  118. }  
  119. /** 
  120.  * 
  121.  * @author Lenovo 
  122.  * @version $Id: RemarkValidator.java, v 0.1 2014年9月24日 下午5:13:48 Lenovo Exp $ 
  123.  */  
  124. public class RemarkValidator implements Validator {  
  125.   
  126.     /** 
  127.      * @see com.cathy.demo.pattern.composite.Validator#hasChild() 
  128.      */  
  129.     public boolean hasChild() {  
  130.         return false;  
  131.     }  
  132.   
  133.     /** 
  134.      * @see com.cathy.demo.pattern.composite.Validator#validate(com.cathy.demo.pattern.composite.RemitModel) 
  135.      */  
  136.     public boolean validate(RemitModel remitModel) {  
  137.         System.out.println("校验汇款附言通过");  
  138.         return true;  
  139.     }  
  140.   
  141.     /** 
  142.      * @see com.cathy.demo.pattern.composite.Validator#addValidator(com.cathy.demo.pattern.composite.Validator) 
  143.      */  
  144.     public void addValidator(Validator validator) {  
  145.         throw new UnsupportedOperationException("子节点,无法增加");  
  146.     }  
  147.   
  148. }  
  149. /** 
  150.  * 
  151.  * @author Lenovo 
  152.  * @version $Id: BankAccountValidator.java, v 0.1 2014年9月24日 下午5:17:28 Lenovo Exp $ 
  153.  */  
  154. public class BankAccountValidator implements Validator {  
  155.   
  156.     /** 
  157.      * @see com.cathy.demo.pattern.composite.Validator#hasChild() 
  158.      */  
  159.     public boolean hasChild() {  
  160.         return false;  
  161.     }  
  162.   
  163.     /** 
  164.      * @see com.cathy.demo.pattern.composite.Validator#validate(com.cathy.demo.pattern.composite.RemitModel) 
  165.      */  
  166.     public boolean validate(RemitModel remitModel) {  
  167.         System.out.println("通过银行账户的校验");  
  168.         return true;  
  169.     }  
  170.   
  171.     /** 
  172.      * @see com.cathy.demo.pattern.composite.Validator#addValidator(com.cathy.demo.pattern.composite.Validator) 
  173.      */  
  174.     public void addValidator(Validator validator) {  
  175.         throw new UnsupportedOperationException("当前为叶子节点");  
  176.     }  
  177.   
  178. }  
  179. /** 
  180.  * 
  181.  * @author Lenovo 
  182.  * @version $Id: PayeeAddressValidator.java, v 0.1 2014年9月24日 下午5:22:38 Lenovo Exp $ 
  183.  */  
  184. public class PayeeAddressValidator implements Validator {  
  185.   
  186.     /** 
  187.      * @see com.cathy.demo.pattern.composite.Validator#hasChild() 
  188.      */  
  189.     public boolean hasChild() {  
  190.         return false;  
  191.     }  
  192.   
  193.     /** 
  194.      * @see com.cathy.demo.pattern.composite.Validator#validate(com.cathy.demo.pattern.composite.RemitModel) 
  195.      */  
  196.     public boolean validate(RemitModel remitModel) {  
  197.         System.out.println("收款人地址校验通过");  
  198.         return true;  
  199.     }  
  200.   
  201.     /** 
  202.      * @see com.cathy.demo.pattern.composite.Validator#addValidator(com.cathy.demo.pattern.composite.Validator) 
  203.      */  
  204.     public void addValidator(Validator validator) {  
  205.         throw new UnsupportedOperationException("当前为叶子节点");  
  206.     }  
  207.   
  208. }  
Java代码
  1. /** 
  2.  * 
  3.  * @author Lenovo 
  4.  * @version $Id: Client.java, v 0.1 2014年9月24日 下午5:15:23 Lenovo Exp $ 
  5.  */  
  6. public class Client {  
  7.   
  8.     /** 
  9.      * 
  10.      * @param args 
  11.      */  
  12.     public static void main(String[] args) {  
  13.         RemitModelValidator remitModelValidator = new RemitModelValidator();  
  14.         remitModelValidator.addValidator(new RemarkValidator());  
  15.         remitModelValidator.addValidator(new BankAccountValidator());  
  16.         PayeeValidator payeeValidator = new PayeeValidator();  
  17.         payeeValidator.addValidator(new PayeeAddressValidator());  
  18.         remitModelValidator.addValidator(payeeValidator);  
  19.         remitModelValidator.validate(new RemitModel());  
  20.     }  
  21.   
  22. }  
       
运行结果:

 

校验汇款附言通过
--
通过银行账户的校验
--
收款人地址校验通过
**
收款人校验通过
--
校验通过
0
0
分享到:
评论

相关推荐

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

    《java设计模式(第2版)》通过一个完整的java项目对经典著作design patterns一书介绍的23种设计模式进行了深入分析与讲解,实践性强,却又不失对模式本质的探讨。本书创造性地将这些模式分为5大类别,以充分展现各个...

    Java 设计模式

    java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元...

    design-pattern-java.pdf

    设计模式综合应用实例 设计模式综合应用实例 多人联机射击游戏 多人联机射击游戏中的设计模式应用(一) 多人联机射击游戏中的设计模式应用(二) 数据库同步系统 设计模式综合实例分析之数据库同步系统(一) 设计...

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

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

    Java 23种设计模式详解

    Java 全部23种设计模式全面详解 设计模式的六大原则 1、开闭原则(Open Close Principle) 2、里氏代换原则(Liskov Substitution Principle) 3、依赖倒转原则(Dependence Inversion Principle) 4、接口隔离原则...

    java26个设计模式

    适配器Adepter 装饰Decorator 合成Composite 代理Proxy 享元Flyweight 门面Facade 桥梁Bridge 不变Immutable 策略Strategy 模版Template 观察者Observer 命令Command 备忘录Memento 状态State 访问者Visitor 解释...

    设计模式Demo

    针对23种设计模式,分别写了demo并画了类图帮助理解。 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰...

    源码:阎宏设计模式光盘

    com.javapatterns.javaio 专题:设计模式在Java I/O中的应用 com.javapatterns.keygen 专题:序列键生成器与单例及多例模式 com.javapatterns.liskov 里氏代换原则 com.javapatterns.lod 迪米特法则 ...

    CompositePattern:复合设计模式示例

    这种设计模式属于结构模式,因为该模式创建了一组对象的树形结构。 此模式创建一个包含其自己的对象组的类。 此类提供了修改其相同对象组的方法。 我们通过以下示例演示复合模式的使用,在该示例中我们将显示组织的...

    design-patterns:来自 Head First Design Patterns 2004 版的 Java 设计模式

    来自 Head First Design Patterns(2004 版)的 Java 设计模式 /适配器 适配器模式将类的接口转换为客户端期望的另一个接口。 适配器让那些因为接口不兼容而不能一起工作的类一起工作。 /命令 命令模式将请求封装为...

    java面试800题

    Q0051 设计模式主要几种 "创建模式 factory工厂模式、prototype原始模型模式、singleton单例模式、builder建造模式 结构模式 facade门面模式、proxy代理模式、adapter适配器(变压器)模式、composite合成模式、...

    java 面试题 总结

    JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用...

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

    exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。 19、同步和异步有何异同,在什么情况下分别使用他们?举例说明。  如果数据将在线程间共享。例如正在写的数据以后可能...

    composite:复合图案

    合成的 Java中的复合设计模式实现

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    SQL(Structured Query Language)结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。同时也是数据库脚本文件的扩展名。  SQL语言主要包含5个部分  数据定义...

Global site tag (gtag.js) - Google Analytics