我是靠谱客的博主 爱笑蛋挞,最近开发中收集的这篇文章主要介绍设计模式系列:组合模式一.名称二.问题(为了解决什么问题)三.解决方案(主要体现在uml和核心代码上)四.例子四.效果(有啥优缺点)常见案例,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一.名称

二.问题(为了解决什么问题)

比较好辨别,因为使用范围很窄

  • 当有一个结构可以组合成树形结构,且需要向客户端提供一致的操作接口,使得客户端操作忽略简单元素与复杂元素,如维护和展示部分-整体关系的场景,如树形菜单、文件和文件夹管理。
  • 从一个整体中能够独立出部分木块或功能的场景。
  • 当有一个结构可以组合成树形结构,且需要向客户端提供一致的操作接口,使得客户端操作忽略简单元素与复杂元素

三.解决方案(主要体现在uml和核心代码上)

组合模式也叫作部分-整体模式,主要来描述部分与整体的关系。官方定义:将对象组合成树形结构以表示部分-整体的层次结构,使得用户对单个对象和组合对象的使用具有一致性。组合模式的要点在于:提取共同点作为基类,把不同点作为子类

类图

这里写图片描述

我们来说说组合模式的几个角色:
Component抽象构件角色:定义参加组合对象的共有方法和属性,可以定义一些默认的行为或属性,比如我们例子中的getInfo就封装到了抽象类中。
Leaf叶子构件:叶子对象,其下再也没有其他的分支,也就是遍历的最小单位。
Composite树枝构件:树枝对象,它的作用是组合树枝节点和叶子节点形成一个树形结构。

通用代码:
这里写图片描述

这里写图片描述

设计模式的扩展

  1. 透明的组合模式、安全的组合模式
  2. 为了解决问题:比如组织结构这棵树,我从中抽取一个用户,要找到它的上级有哪些,下级有哪些,怎么处理?
    解决方案:在基类中增加两个方法:setParent是设置父节点是谁,getParent是查找父节点是谁。

组合模式体现了:开闭原则,里氏替换原则,依赖倒置原则
因为使用了抽象类——开闭原则
因为使用了抽象类——里氏替换原则
因为使用了抽象类和继承——依赖倒置原则

四.例子

一个公司有ceo,经理,员工,描述一下这个树形结构。
基类节点:

/**
 * Created by annuoaichengzhang on 16/3/25.
 */
public abstract class Corp {
    private String name = "";
    private String position = "";
    private int salary = 0;

    public Corp(String name, String position, int salary) {
        this.name = name;
        this.position = position;
        this.salary = salary;
    }

    public String getInfo() {
        return "姓名:" + this.name + "t职位:" + this.position + "t薪资:" + this.salary;
    }
}

子类节点:

/**
 * Created by annuoaichengzhang on 16/3/25.
 */
public class Branch extends Corp {
    private ArrayList<Corp> subordinateList = new ArrayList<>();

    public Branch(String name, String position, int salary) {
        super(name, position, salary);
    }

    public void addSubordinate(Corp corp) {
        this.subordinateList.add(corp);
    }

    public ArrayList<Corp> getSubordinateList() {
        return this.subordinateList;
    }
}
/**
 * Created by annuoaichengzhang on 16/3/25.
 */
public class Leaf extends Corp {

    public Leaf(String name, String position, int salary) {
        super(name, position, salary);
    }
}

client:

public class Client {
    public static void main(String[] args) {
        Root ceo = new Root("王大麻子", "总经理", 100000);
        IBranch developDep = new Branch("lisi", "研发部经理", 20000);
        IBranch salesDep = new Branch("wangwu", "销售部经理", 20000);

        IBranch firstZuZhang = new Branch("zuzhang1", "开发组长1", 5000);
        IBranch secondZuZhang = new Branch("zuzhang2", "开发组长2", 5000);

        ILeaf a = new Leaf("a", "开发人员", 2000);
        ILeaf b = new Leaf("b", "开发人员", 2000);
        ILeaf c = new Leaf("c", "开发人员", 2000);
        ILeaf d = new Leaf("d", "开发人员", 2000);

        ceo.add(developDep);
        ceo.add(salesDep);

        developDep.add(firstZuZhang);
        developDep.add(secondZuZhang);

        firstZuZhang.add(a);
        firstZuZhang.add(b);

        secondZuZhang.add(c);
        secondZuZhang.add(d);
    }
}

四.效果(有啥优缺点)

这里写图片描述

常见案例

杀毒软件。遍历每个文件,为不同类型的文件格式提供不同的杀毒方式。

界面控制库。界面控件分为两大类:一类是单元控件,例如按钮、文本框等,另一类是容器控件,例如窗体、中间面板灯。试用组合模式设计该界面控件库。

最后

以上就是爱笑蛋挞为你收集整理的设计模式系列:组合模式一.名称二.问题(为了解决什么问题)三.解决方案(主要体现在uml和核心代码上)四.例子四.效果(有啥优缺点)常见案例的全部内容,希望文章能够帮你解决设计模式系列:组合模式一.名称二.问题(为了解决什么问题)三.解决方案(主要体现在uml和核心代码上)四.例子四.效果(有啥优缺点)常见案例所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部