设计模式的分类
我们都知道有 23 种设计模式,这 23 种设计模式可分为如下三类:
- 创建型模式(5 种):单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
- 结构型模式(7 种):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
- 行为型模式(11 种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
设计模式系列文章传送门
什么是组合模式
组合模式又叫作整体-部分模式,它将对象组合成树状的层次结构,用来表示整体-部分的关系,使用户对单个对象和组合对象具有一致的访问性,是一种结构型模式。
抽象模式的组成
- 抽象组件:定义组合模式中所有对的通用方法,一般是一个接口或者是一个类。
- 叶子节点:没有子节点的对象,实现了抽象节点。
- 组合节点:也叫容器,是一个包含子节点的节点,其子节点可以是叶子节点,也可以是其他容器节点,也实现了抽象组件。
组合模式实现案例
我们以篮球运动中得分方式来做为案例,我们知道篮球运动中得分的方式有三分得分、两分得分、罚球得分,其中篮球运动的得分方式就是抽象组件,三分得分、两分得分、罚球得分就是叶子节点,获取篮球运动的所有得分方式就是组合节点。
组合模式实现案例
我们以篮球运动中得分方式来做为案例,我们知道篮球运动中得分的方式有三分得分、两分得分、罚球得分,其中篮球运动的得分方式就是抽象组件,三分得分、两分得分、罚球得分就是叶子节点,获取篮球运动的所有得分方式就是组合节点。
BasketBallScore(抽象组件)
我们把篮球得分的方式定义为抽象组件,代码如下:
public interface BasketBallScore {
//获取得分
int gatScore();
}
ThreeScore(叶子节点)
3分投篮是一种篮球得分方式,ThreeScore 类实现了 BasketBallScore 接口,并实现了得分方法,代码如下:
public class ThreeScore implements BasketBallScore{
@Override
public int gatScore() {
System.out.println("命中3分,得到3分");
return 3;
}
}
TwoScore(叶子节点)
2分投篮也是一种篮球得分方式,TwoScore 类实现了 BasketBallScore 接口,并实现了得分方法,代码如下:
public class TwoScore implements BasketBallScore{
@Override
public int gatScore() {
System.out.println("命中抛投得到2分");
return 2;
}
}
PenaltyKick(叶子节点)
罚球得分也是一种篮球得分方式,PenaltyKick 类实现了 BasketBallScore 接口,并实现了得分方法,代码如下:
public class PenaltyKick implements BasketBallScore{
@Override
public int gatScore() {
System.out.println("命中组合罚球获得1分");
return 1;
}
}
CombinationScore(组合节点)
组合节点 CombinationScore 实现了了抽象组件,也实现了得分方式,代码如下:
public class CombinationScore implements BasketBallScore {
private List<BasketBallScore> scoreList = new ArrayList<>();
public void addBasketBallScore(BasketBallScore basketBallScore) {
scoreList.add(basketBallScore);
}
@Override
public int gatScore() {
int allScore = 0;
for (BasketBallScore basketBallScore : scoreList) {
allScore = allScore + basketBallScore.gatScore();
}
return allScore;
}
}
ClientComposite(客户端)
客户端验证获取得分的方式,代码如下:
public class ClientComposite {
public static void main(String[] args) {
//叶子节点 3分
ThreeScore threeScore = new ThreeScore();
//叶子节点 2分
TwoScore twoScore = new TwoScore();
//叶子节点 1分
PenaltyKick penaltyKick = new PenaltyKick();
//组合节点 获取所有的得分
CombinationScore combinationScore = new CombinationScore();
combinationScore.addBasketBallScore(threeScore);
combinationScore.addBasketBallScore(twoScore);
combinationScore.addBasketBallScore(penaltyKick);
int allScore = combinationScore.gatScore();
System.out.println("总得分为:" + allScore);
}
}
执行结果如下:
命中3分,得到3分
命中抛投得到2分
命中组合罚球获得1分
总得分为:6
组合模式的优缺点
优点
- 提供了统一的标准接口,可以使客户端统一处理单个对象和组合对象,并且不用区分类型,同时也降低了代码复杂性。
- 增强了代码的灵活性,可以灵活的增加或者删除叶子节点类型,不影响客户端代码。
缺点:
- 映入组合设计模式在一定程度上会增加系统的复杂性,对系统研发人员的设计能力有一定的要求。
- 要求所有组件统一接口,有一定的局限性。
组合模式的适用场景
- 菜单和菜单项,这本身就是一个树状结构。
- 组织架构和人员管理,这本身也是一个树状结构。
- 文件系统和目录结构,同样也是一个树状结构。
简而言之,所有树状结构的场景都比较适合使用组合模式。
总结:本篇分享了组合模式的概念和使用,使用了篮球得分的案例进行了代码演示,希望可以帮助理解,也希望可以帮助到有需要的朋友。
如有不正确的地方欢迎各位指出纠正。
标签:得分,组合,--,模式,public,设计模式,节点 From: https://blog.csdn.net/weixin_42118323/article/details/144356826