设计模式 在线

2258组合模式

1、组合模式,就是在一个对象中包含其他对象,这些被包含的对象可能是终点对象(不再包含别的对象),也有可能是非终点对象(其内部还包含其他对象,或叫组对象),我们将对象称为节点,即一个根节点包含许多子节点,这些子节点有的不再包含子节点,而有的仍然包含子节点,以此类推。

2、所谓组合模式,其实说的是对象包含对象的问题,通过组合的方式(在对象内部引用对象)来进行布局,我认为这种组合是区别于继承的,而另一层含义是指树形结构子节点的抽象(将叶子节点与数枝节点抽象为子节点),区别于普通的分别定义叶子节点与数枝节点的方式。

更多内容请查看:Java 设计模式之组合模式及应用场景

2257过滤器模式

过滤模式的实现在java8里面有典型的应用方法就是分组操作,可以根据指定的指标进行分组筛选。

Map<Integer, List<Person >> groupMap = persons.stream().collect(Collectors.groupingBy(Person::getGender));
groupMap.forEach((k, v) -> {
    System.out.println(k);
    v.forEach(System.out::println);
});

得到的结果形式就是:

  • k:是分组的指标,上面代码中的 gender
  • v:是一个list的集合对象,就是 personList

2256桥接模式

可以这样想:猪八戒投胎,灵魂在河的一边,河对面有两个肉体,红猪和绿猪;

灵魂需要过桥,选择红猪的肉体或者绿猪的肉体完成投胎。

在上面的例子中,红猪和绿猪就是 RedCircle 和 GreenCircle,灵魂是 Circle 类,而那座桥就是 drawAPI 这个接口。

2255桥接模式

桥接模式中,具体的实现类放在作为“桥梁”的接口中实现,而“桥梁”接口中只有实现功能的抽象方法;具体实现类是继承“桥梁”,而不直接继承实现类的抽象类,抽象类与具体的实现类在结构上是相互独立的,两者的相互变化并不会影响到彼此,只要“桥梁”没变,两者的变化并不会影响到彼此。

就以上教程的实例程序来说,具体的实现是RedCircle、GreenCircle,它们的抽象类为Shape,按一般逻辑来说,我们是直接继承Shape来创建不同的具体对象,但桥接模式中是通过“桥梁”DrawAPI建立抽象与具体实现之间的联系,调用DrawAPI中的方法来具体实现。

2254桥接模式

桥接模式:Bridge Pattern

将抽象和实现放在两个不同的类层次中,使它们可以独立地变化。——《Head First 设计模式》

将类的功能层次结构和实现层次结构相分离使二者能够独立地变化并在两者之间搭建桥梁,实现桥接。—— 《图解设计模式》

类的功能层次结构:父类具有基本功能,在子类中增加新的功能;

类的实现层次结构:父类通过声明抽象方法来定义接口,子类通过实现具体方法来实现接口;

桥接模式中有四个角色:

抽象化角色:使用实现者角色提供的接口来定义基本功能接口。

持有实现者角色,并在功能接口中委托给它,起到搭建桥梁的作用;

注意,抽象化角色并不是指它就是一个抽象类,而是指抽象了实现。

改善后的抽象化角色:作为抽象化角色的子类,增加新的功能,也就是增加新的接口(方法);与其构成类的功能层次结构;

实现者角色:提供了用于抽象化角色的接口;它是一个抽象类或者接口。

具体的实现者角色:作为实现者角色的子类,通过实现具体方法来实现接口;与其构成类的实现层次结构。

如果抽象和实现两者做不到独立地变化,就不算桥接模式。