Head First 设计模式 —— 14. 复合 (Compo

2021-01-17  本文已影响0人  满赋诸机

复合模式

在一个解决方案中结合两个或多个模式,以解决一般或重复发生的问题。 P500

思考题

public interface Quackable {
    public void quack();
}

public class MallardDuck implements Quackable {
    public void quack() {
        System.out.println("Quack");
    }
}

public class Goose {
    public void honk() {
        System.out.println("Honk");
    }
}

假设我们想要在所有使用鸭子的地方使用鹅,毕竟鹅会叫、会飞、会游,和鸭子差不多。什么模式可以让我们轻易地将鸭子和鹅掺杂在一起呢? P503

思考题

我们要如何在不变化鸭子类的情况下,计算所有鸭子呱呱叫的总次数呢?有没有什么模式可以帮上忙?P505

思考题

你能够为鹅写一个抽象工厂吗?创建”内鹅外鸭“的对象时,你怎么处理? P511

思考题

我们需要将鸭子视为一个集合,甚至是子集合(subcollection),如果我们下一次命令,就能让整个集合的鸭子听命行事,那就太好了。什么模式可以帮我们? P512

思考题

你能够有办法持续追踪个别鸭子的实时呱呱叫吗? P516

思考题

我们还没有改变一个 Quackable 的实现,即 QuackCounter 装饰器。它也必须成为 Observable 。你何不试着写出它的代码呢? P518

public class QuackCounter implements Quackable {
    Quackable duck;
    static int numberOfQuacks;
    
    public QuackCounter(Quackable duck) {
        this.duck = duck;
    }
    
    public void quack() {
        duck.quack();
        ++numberOfQuacks;
    }
    
    public static int getQuacks() {
        return numberOfQuacks;
    }
    
    public void registerObserver(Observer observer) {
        duck.registerObserver(observer);
    }
    
    public void notifyObservers() {
        duck.notifyObservers();
    }
}

思考题

万一呱呱叫学家想观察整个群,又该怎么办呢?当观察某个组合时,就等于观察组合内的每个东西。 P520

public class Flock implements Quackable {
    ArrayList ducks = new ArrayList();
    
    public void add(Quackable duck) {
        ducks.add(duck);
    }
    
    public void quack() {
        Iterator iterator = ducks.iterator();
        while(iterator.hasNext()) {
            Quackable duck = (Quackable) iterator.next();
            duck.quack();
        }
    }
    
    public void registerObserver(Observer observer) {
        Iterator iterator = ducks.iterator();
        while(iterator.hasNext()) {
            Quackable duck = (Quackable) iterator.next();
            duck.registerObserver(observer);
        }
    }
    
    public void notifyObservers() {
        // 鸭群注册观察者都委托到孩子上了,所以通知观察者的事情并不需要鸭群做任何事
    }
}

所思所想

上一篇下一篇

猜你喜欢

热点阅读