设计模式(结构型设计模式——组合模式)

设计模式(结构型设计模式------组合模式)

组合模式

基本定义

  1. 组合模式组合多个对象行成树结构以表示"整体-部分"的结构层次。
  2. 组合模式对单个对象(叶子对象)和组合对象具有一致性,它将对象组织到树结构中,可以用来描述整体与部分的关系。
  3. 在使用组合模式中需要注意一点也是组合模式最关键的地方,叶子对象和组合对象实现相同的接口,这就是组合模式能够将叶子节点和对象节点进行一致处理的原因。

模式结构

Component:组合模式对象声明接口,在适当的情况下,实现所有类的共有接口的默认行为。申明一个接口用于访问和管理Component子部件。

Leaf: 叶子对象,叶子节点没有子节点(他是Component的子类,具体的实现类)

Composite: 容器对象

代码实现

Component 组合模式抽象对象
java 复制代码
public abstract class Game {
    String name;

    public Game(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    //展示游戏
    public abstract void display();
}
Leaf 叶子节点, Component的子类,具体的实现类
java 复制代码
@Slf4j
public class CS extends Game{
    public CS(String name) {
        super(name);
    }
    public void display() {
        log.info("正在加载{}游戏", super.getName());
    }
}
java 复制代码
@Slf4j
public class Lol extends Game {

    public Lol(String name) {
        super(name);
    }

    public void display() {
        log.info("正在加载{}游戏", super.getName());
    }
}
java 复制代码
@Slf4j
public class Dota extends Game {

    public Dota(String name) {
        super(name);
    }

    public void display() {
        log.info("正在加载{}游戏", super.getName());
    }
}
Composite 容器
java 复制代码
@Slf4j
public class GameStore extends Game{

    List<Game> gameList = null;

    public GameStore(String name) {
        super(name);
        gameList = new ArrayList<>();
    }
    /**
     * 展示游戏
     */
    public void display() {
        for (Game game: gameList){
            game.display();
        }
    }

    public void add(Game game){
        gameList.add(game);
    }

    public void remove(Game game){
        gameList.remove(game);
    }
}
测试类
java 复制代码
@Slf4j
public class Test {

    public static void main(String[] args){
        GameStore gameStore = new GameStore("全部游戏");
        CS cs = new CS("CS");
        gameStore.add(cs);

        GameStore competitiveGameStore = new GameStore("MOBA竞技游戏");
        Dota dota = new Dota("Dota");
        Lol lol = new Lol("英雄联盟");
        competitiveGameStore.add(dota);
        competitiveGameStore.add(lol);
        //整体-部分
        //Game可以看成是整体(Game是抽象类), GameStore也是整体, CS/LOL/Dota是部分(实现类是部分)
        //Game是总体的父类,只有继承了Game的gameStore才拥有"整体"的这个属性
        gameStore.add(competitiveGameStore);
       
        //展示全部游戏
        log.info("展示全部游戏中。。。");
        gameStore.display();
    }
}

优点

  1. 可以清楚的定义分层次的复杂对象,表示对象的全部或部分层次,使得增加新构件更容易
  2. 客户端调用简单,客户端可以一致的使用组合结构或其中的单个对象。
  3. 定义了包括叶子对象和容器对象的类层次结构,叶子对象可以被组合成更复杂的容器对象,而这个容器对象又可以被组合,这样不断的递归下去,可以形成复杂的树形结构。
  4. 更容易组合体内加入对象构件,客户端不必因为加入新的构件而改变原有代码。

缺点

使设计变得更加抽象,对象业务规则如果很复杂,则实现组合模式有很大的挑战性,而且不是所有的方法都与叶子对象子类都有关联。

使用场景

  1. 需要表示一个对象整体-部分层次,在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,可以一致对待他们。
  2. 让客户能够忽略不同对象的层次变化,客户端可以针对抽象构件编程,无须关心层次的结构细节。

模式总结

  1. 组合模式用于将多个对象组合成树形结构以表示"整体与部分"的结构层次,组合模式对单个对象(叶子对象)和组合对象(容器对象)的使用具有一致性。
  2. 组合对象的关键在于他定义了一个抽象构建类,它即可表示叶子对象,也可以表示容器对象,客户仅仅需要针对这个抽象构建进行编程,无须知道它是叶子对象还是容器对象。都一致性对待。
  3. 组合模式虽然能够很好的处理层次结构,也使得客户端程序变的简单,但它使得设计变的更加抽象,而且也很难对容器的构建类型限制,这会导致在增加新的构建时产生一些问题。
相关推荐
晨米酱12 小时前
JavaScript 中"对象即函数"设计模式
前端·设计模式
数据智能老司机17 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机18 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机18 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机18 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
使一颗心免于哀伤18 小时前
《设计模式之禅》笔记摘录 - 21.状态模式
笔记·设计模式
数据智能老司机2 天前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
数据智能老司机2 天前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
烛阴2 天前
【TS 设计模式完全指南】懒加载、缓存与权限控制:代理模式在 TypeScript 中的三大妙用
javascript·设计模式·typescript
李广坤2 天前
工厂模式
设计模式