java设计模式总结九:合成模式
来源:互联网 发布:p2p网络借贷监管细则 编辑:程序博客网 时间:2024/05/28 14:57
合成模式定义
合成模式,也叫树形模式,就是把部分和整体的关系通过树形结构来表示,使得客户端对单个对象和组合对象的使用具有一致性
合成模式也是继承的另一种替代方法
合成模式组成结构
合成模式主要由三个部分组成:抽象类、叶子类和父类
1.抽象类:这是一个抽象角色,它给参加组合的对象定义出公共的接口以及默认的行为,组合对象的名义父类可以通过它来管理所有的子对象,而不需要通过继承
2.叶子类:名义上的子类,通过实现接口,定义出参加组合的原始对象的行为
3.父类:名义上的父类,通过实现接口的方法进行行为组合,通常在该类中定义一个私有的叶子类成员集合(通常为List或者数组等),主要用于实现父类原始对象行为和叶子类原始对象行为合成
合成模式使用场景
在进行电脑的复制操作时,我们复制文件,使用ctrl+c组合键,然后到目的目录下使用ctrl+v组合键就可以将文件复制到指定文件中。在复制文件夹时,同样使用ctrl+c和ctrl+v进行复制,而不需要将文件夹中的文件一个个的进行复制,即,对于用户而言,不管是文件还是文件夹的复制,操作方式都是一样的,这就是合成模式的典型应用
非合成模式实现:文件(夹)复制
首先创建文件夹类:
public class Folder{ private String name; private List<Folder> list = new ArrayList<Folder>(); public Folder(){ } public Folder(String name){ this.name = name; } public void add(Folder folder){ list.add(folder); } public void remove(Folder folder){ list.remove(folder); } public String getName(){ return this.name; } public void copy(){ System.out.println("进行文件夹的复制:"+this.getName()); for(int i=0; i<list.size(); i++){ Folder folder = list.get(i); folder.copy(); } }}
定义文件,扩展文件夹:
public class File1 extends Folder{ private String name; public File1(String name){ this.name = name; } public String getName(){ return this.name; } @Override public void copy(){ System.out.println("正在复制文件:"+this.getName()); }}public class File2 extends Folder{ private String name; public File2(String name){ this.name = name; } public String getName(){ return this.name; } @Override public void copy(){ System.out.println("正在复制文件:"+this.getName()); }}
最后在客户端进行赋值文件和文件夹测试:
public class Client{ public static void main(String[] args){ Folder folder1 = new Folder("文件夹1"); Folder folder2 = new Folder("文件夹2"); File file1 = new File("文件1"); File file2 = new File("文件2"); File file3 = new File("文件3"); folder1.add(file1); folder2.add(file2); folder2.add(file3); folder1.copy(); folder2.copy(); }}
输出结果可以看到文件和文件夹都能成功复制
合成模式实现:文件(夹)的复制
首先定义一个接口:
public interface Component{ p pubic void copy();}
分别定义文件和文件夹实现该接口并实现copy方法:
class Folder implements Component{ private String name; private List<Component> lists = new ArrayList<Component>(); public Folder(String name){ this.name = name; } public String getName(){ return this.name; } public void add(Component com){ lists.add(com); } public void remove(Component com){ lists.remove(com); } public void copy(){ System.out.println("文件夹复制中:"+this.getName()); for(int i=0; i<lists.size(); i++){ Component com = lists.get(i); com.copy(); } }}class File1 implements Component{ private String name; public File1(String name){ this.name = name; } public String getName(){ return this.name; } public void copy(){ System.out.println("\t正在复制文件:"+this.getName()); }}class File2 implements Component{ private String name; public File2(String name){ this.name = name; } public String getName(){ return this.name; } public void copy(){ System.out.println("\t正在复制文件:"+this.getName()); }}
客户端测试代码:
public class CompositeMain { public static void main(String[] args){ Folder folder1 = new Folder("文件夹1"); Folder folder2 = new Folder("文件夹2"); Component file1 = new File1("文件1"); Component file2 = new File2("文件2"); folder1.add(file1); folder2.add(file2); folder1.copy(); folder2.copy(); }}
我们可以看到,同样实现了文件和文件夹的复制,并且文件和文件夹之间并没有继承关系,从而减少了类之间的耦合
合成模式应用
合成模式在程序设计中有着广泛的应用,比如Dom4j、资源管理器、Java GUI容器层次图等等都是合成模式应用的典范。
阅读全文
0 0
- java设计模式总结九:合成模式
- java设计模式---合成模式
- Java设计模式-合成模式
- Java设计模式--合成模式
- java设计模式---合成模式2
- java设计模式---合成模式3
- Java设计模式笔记之合成模式
- 《Java设计模式》之合成模式
- java设计模式之合成模式
- JAVA设计模式之合成模式
- 设计模式:合成模式
- 模式九(合成模式)
- java 设计模式-结构模式之合成模式
- Java设计模式(六)合成模式 享元模式
- java设计模式之Composite(合成)
- 设计模式:合成聚合
- 设计模式之:合成模式
- 设计模式之合成模式
- android 检查对象属性是否有一个为空
- vmware中Mac OS X10.9熟悉
- crond命令
- 贪心入门(例题为主)
- vue中计算属性computed的getter setter问题
- java设计模式总结九:合成模式
- XPath 语法
- 双目测距基本原理:
- 重载,重写以及多态
- log4j:WARN No appenders could be found for logger
- 合并排序
- Xcode 9:配置文件管理Xcode,但签名设置需要手动管理的配置文件
- CSS选择器
- F