设计模式之合成模式
2016-03-17 23:44
267 查看
合成模式:
合成模式把部分和整体的关系用树结构表示出来,合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等对待。有些地方合成模式又叫做组合模式。
抽象构件角色:
这是一个抽象角色,它给参加组合的对象规定一个接口。这个角色给出共有的接口及其默认行为。
树叶构件角色:
代表参加组合的树叶对象,一个树叶没有下级的子对象定义出参加组合的原始对象的行为。
树枝构件角色:
代表参加组合的有子对象的对象,并给出树枝构件对象的行为。
合成模式:
1.安全模式
2.透明模式
安全模式:
透明模式
安全模式和透明模式:
透明模式,合成类和树叶节点都统一实现Component 接口。客户端可以同等对待,编译不出错,运行会出错。
缺点是不够安全,因为树叶类节点和合成类对象是有区别的,树叶类是不可能有add,remove 等操作。
安全模式,合成类和树叶类具有不同的实现,因为树叶节点根本没有管理子类对象的方法。
如果对树叶类使用这些方法时,程序会在编译时期出错。
缺点是不够透明,合成类和树叶类都有不同的接口。
合成模式解耦了客户程序与复杂元素内部结构,从而使客户程序可以向处理简单元素一样来处理复杂元素。
如果你想要创建层次结构,并可以在其中以相同的方式对待所有元素,那么合成模式就是最理想的选择。
总结:合成模式主要是在于树叶节点和树枝节点,树枝节点可以进行对象的管理,例如:增加和删除。
下面两个例子说明安全模式和透明模式。
安全模式
透明模式
透明模式和安全模式的区别就在于,叶子节点也可以进行对象的管理即是添加叶子节点。
合成模式把部分和整体的关系用树结构表示出来,合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等对待。有些地方合成模式又叫做组合模式。
抽象构件角色:
这是一个抽象角色,它给参加组合的对象规定一个接口。这个角色给出共有的接口及其默认行为。
树叶构件角色:
代表参加组合的树叶对象,一个树叶没有下级的子对象定义出参加组合的原始对象的行为。
树枝构件角色:
代表参加组合的有子对象的对象,并给出树枝构件对象的行为。
合成模式:
1.安全模式
2.透明模式
安全模式:
透明模式
安全模式和透明模式:
透明模式,合成类和树叶节点都统一实现Component 接口。客户端可以同等对待,编译不出错,运行会出错。
缺点是不够安全,因为树叶类节点和合成类对象是有区别的,树叶类是不可能有add,remove 等操作。
安全模式,合成类和树叶类具有不同的实现,因为树叶节点根本没有管理子类对象的方法。
如果对树叶类使用这些方法时,程序会在编译时期出错。
缺点是不够透明,合成类和树叶类都有不同的接口。
合成模式解耦了客户程序与复杂元素内部结构,从而使客户程序可以向处理简单元素一样来处理复杂元素。
如果你想要创建层次结构,并可以在其中以相同的方式对待所有元素,那么合成模式就是最理想的选择。
总结:合成模式主要是在于树叶节点和树枝节点,树枝节点可以进行对象的管理,例如:增加和删除。
下面两个例子说明安全模式和透明模式。
安全模式
public interface Component { //输出超市购物商品 public void print(); } //叶子节点 输出一个商品 public class Leaf implements Component { private String name; public Leaf(String name){ this.name=name; } public void print() { System.out.println(" "+name); } } //树枝节点 购物车 有多个商品 public class Composite implements Component { //用于管理树枝节点多个对象 private List<Component> product=new ArrayList<Component>(); //对象名字 private String name ; public Composite(String name){ this.name=name; } //购物车加入一个商品 public void addComponent(Component testComp){ product.add(testComp); } //购物车移除一个商品 public void removeComponent(int index){ product.remove(index); } public void print() { System.out.println(" "+name); if(this.product!=null){ for(Component testComp:product){ System.out.println();//下一行 testComp.print(); } } } } public class Client { // 安全模式 public static void main(String[] args) { Composite root = new Composite("根节点"); Leaf c1 = new Leaf(" 叶子节点"); Composite c2 = new Composite(" 树枝节点"); Leaf c3 = new Leaf(" 树枝节点的叶子节点"); root.addComponent(c1); root.addComponent(c2); c2.addComponent(c3); root.print(); } }
透明模式
透明模式和安全模式的区别就在于,叶子节点也可以进行对象的管理即是添加叶子节点。
public abstract class Component { //输出超市购物商品 public abstract void print(); /** * 聚集管理方法,增加一个子构件对象 * @param child 子构件对象 */ public void addChild(Component child){ /** * 缺省实现,抛出异常,因为叶子对象没有此功能 * 或者子组件没有实现这个功能 */ throw new UnsupportedOperationException("对象不支持此功能"); } /** * 聚集管理方法,删除一个子构件对象 * @param index 子构件对象的下标 */ public void removeChild(int index){ /** * 缺省实现,抛出异常,因为叶子对象没有此功能 * 或者子组件没有实现这个功能 */ throw new UnsupportedOperationException("对象不支持此功能"); } /** * 聚集管理方法,返回所有子构件对象 */ public List<Component> getChild(){ /** * 缺省实现,抛出异常,因为叶子对象没有此功能 * 或者子组件没有实现这个功能 */ throw new UnsupportedOperationException("对象不支持此功能"); } } public class Composite extends Component{ //用于管理树枝节点多个对象 private List<Component> product=new ArrayList<Component>(); //对象名字 private String name ; public Composite(String name){ this.name=name; } //购物车加入一个商品 public void addComponent(Component testComp){ product.add(testComp); } //购物车移除一个商品 public void removeComponent(int index){ product.remove(index); } public void print() { System.out.println(" "+name); if(this.product!=null){ for(Component testComp:product){ System.out.println();//下一行 testComp.print(); } } } } public class Leaf extends Component{ public String name; public Leaf(String name){ this.name=name; } public void print() { System.out.println(" "+name); } } public class Client { // 安全模式 public static void main(String[] args) { Composite root = new Composite("根节点"); Leaf c1 = new Leaf(" 叶子节点"); Composite c2 = new Composite(" 树枝节点"); Leaf c3 = new Leaf(" 树枝节点的叶子节点"); root.addComponent(c1); root.addComponent(c2); c2.addComponent(c3); root.print(); } }
相关文章推荐
- java SE基础知识初记(1)i
- jquery 现实多状态控件 (status & power(2,0)) = power(2,0)
- 技术社区
- Delphi主窗口任务栏菜单的问题(转发WM_SYSCOMMAND到Application)
- 当JAVA WEB服务器端有一个执行时间长的方法,应该如何处理?
- 个人博客
- IOS 获取地理位置信息并逆向解析
- JAVA 界面 - 记事本
- Python 文件目录操作
- 我的JS学习笔记-----函数
- [Getting and Cleaning data] swirl
- 快速排序(C/C++版)
- VS2010按任意键出错的解决 与 遇到了异常,可能是由某个扩展导致的(转)
- css垂直居中的几种方法
- :nth-child(odd)与:odd之间的比较
- 异常处理 Exception
- Android开发之AutoCompleteTextView :自动提供可选择内容
- PHP流程控制之条件结构
- spark-submit
- Log4net