Java设计模式之组合模式的示例详解

网友投稿 843 2022-08-24


Java设计模式之组合模式的示例详解

目录定义原理类图案例需求方案分析总结

定义

组合模式,又叫部分整体模式,它创建了对象组的数据结构(将对象组合成树状结构,用来表示部分整体的层级关系)组合模式使得用户对单个对象和组合对象的访问具有一致性

原理类图

Component :这是组合模式中的抽象构件,他里面定义了所有类共有的默认行为,用来访问和管理Component的子部件,Component可以是抽象类,也可以是接口

leaf :在组合模式中表示叶子节点,叶子节点没有子节点了,他是最末端存放数据的结构

Composite:非叶子节点,下面仍然有分支,用来存储分支,实现了Component 定义的默认行为

案例

需求

商场的服装店,专卖店,衣服,裤子的关系

方案

定义组合模式的抽象构件

public abstract class Component {

private String name;

private String desc;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getDesc() {

return desc;

}

public void setDesc(String desc) {

this.desc = desc;

}

public Component(String name, String desc) {

this.name = name;

this.desc = desc;

}

public void add(Component component){

throw new UnsupportedOperationException();

}

public void remove(Component component){

throw new UnsupportedOperationException();

}

public abstract void show();

}

定义服装商铺类

public class Store extends Component{

List componentList = new ArrayList();

public Store(String name, String desc){

super(name, desc);

}

@Override

public String getName() {

return super.getName();

}

@Override

public String getDesc() {

return super.getDesc();

}

@Override

public void add(Component component) {

System.out.println("添加:" + getName());

componentList.add(component);

}

@Override

public void remove(Component component) {

System.out.println("移除:" + getName());

componentList.remove(component);

}

@Override

public void show() {

for (Component component : componentList) {

System.out.println(component.getName());

component.show();

}

}

}

定义服装专卖店商铺

public class BrandStore extends Component{

List componentList = new ArrayList();

public BrandStore(String name, String desc) {

super(name, desc);

}

@Override

public String getName() {

return super.getName();

}

@Override

public String getDesc() {

return super.getDesc();

}

@Override

public void add(Component component) {

componentList.add(component);

}

@Override

public void remove(Component component) {

componentList.remove(component);

}

@Override

public void show() {

for (Component component : componentList) {

System.out.println(component.getName());

component.show();

}

}

}

定义运动装

public class Sportswear extends Component{

List componentList = new ArrayList();

@Override

public String getName() {

return super.getName();

}

@Override

public String getDesc() {

return super.getDesc();

}

public Sportswear(String name, String desc) {

super(name, desc);

}

@Override

public void add(Component component) {

componentList.add(component);

}

@Override

publiciZCoScjoC void remove(Component component) {

componentList.remove(component);

}

@Override

public void show() {

for (Component component: componentList) {iZCoScjoC

System.out.println(component.getName());

}

}

}

定义测试类

public class Test {

public static void main(String[] args) {

// 服装店

Component store = new Store("服装店","服装店");

// 专卖店

Component brandStore1 = new BrandStore("李宁服装专卖店","李宁服装专卖店");

Component brandStore2 = new BrandStore("361服装专卖店","361服装专卖店");

// 运动装

Component sportswear1 = new Sportswear("运动装","运动装");

Component sportswear2 = new Sportswear("休闲装","休闲装");

brandStore1.add(sportswear1);

brandStore2.add(sportswear2);

store.add(brandStore1);

store.add(brandStore2);

store.show();

}

}

查看测试结果

分析

该案例中,服装店(Store),专卖店(BrandStore),运动装(Sportswear)都继承了抽象构件(Component),通过持有一个list来管理自身持有的对象,这样客户端就可以一致处理单个对象和组合对象,屏蔽了对象层次的差异性,这样的话,一致的行为就可以控制不同的层次了。

总结

优势

组合模式可以使得客户端代码可以一致的处理单个对象和组合对象,无须关心自己处理的是单个还是组合,屏蔽了对象系统的层次差异性,这样的话一致的行为就可以控制不同层次了

扩展性非常高,可以很方便的增加叶子节点和非叶子节点,并且对于现有的类库无侵入,满足开闭原则

劣势

如果说各个节点有很大差异的话,不适合使用组合模式

使用场景

处理树形结构,具备统一行为,建议大家使用组合模式

想体现对象的部分,整体结构的时候,可以使用组合模式,典型一点例如文件和文件夹

到此这篇关于java设计模式之组合模式的示例详解的文章就介绍到这了,更多相关Java组合模式内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:如何实现文件下载进度条呢?(java下载进度条)
下一篇:python selenium 如何选中iframe中的元素?
相关文章

 发表评论

暂时没有评论,来抢沙发吧~