2011年12月25日日曜日

[设计模式] 桥接模式 (Bridge)

1. 场景
结构型模式
应对某个类具有两个或两个以上的维度变化
把变化部分抽象出来, 使变化部分与主类分离开来, 从而将多个维度的变化彻底分离
最后提供一个管理类来组合不同维度上的变化, 通过这种组合来满足业务的需要
JavaEE应用中常见的 Service 层对 DAO 层的引用正是桥接模式的应用

2. 实例
AbstractNoodle (面抽象类)
--BeefMoodle (牛肉面)
--PorkyNoodle (猪肉面)

Peppery (胡椒抽象接口)
--PepperySytle (加胡椒)
--PlainStyle (不加胡椒)

2-1. 抽象类
public abstract class AbstractNoodle {
    // 组合一个 Peppery 变量, 用于将该维度的变化独立出来
    protected Peppery style;

    // 每份 Noodle 必须组合一个 Peppery 对象
    public AbstractNoodle(Peppery style) {
        this.style = style;
    }

    public abstract void eat();
}

2-2. 子类 (1)
public class BeefMoodle extends AbstractNoodle {
    public BeefMoodle(Peppery style) {
        super(style);
    }

    // 实现 eat() 抽象方法
    public void eat() {
        System.out.println("这是一碗美味的牛肉面条. " + super.style.style());
    }
}

2-3. 子类 (2)
public class PorkyNoodle extends AbstractNoodle {
    public PorkyNoodle(Peppery style) {
        super(style);
    }

    // 实现 eat() 抽象方法
    public void eat() {
        System.out.println("这是一碗稍嫌油腻的猪肉面条. " + super.style.style());
    }
}

2-4. 行为/属性抽象 (接口)
public interface Peppery {
    String style();
}

2-5. 行为/属性实现类 (1)
public class PepperySytle implements Peppery {
    // 实现 "辣味" 风格的方法
    public String style() {
        return "辣味很重, 很过瘾...";
    }
}

2-6. 行为/属性实现类 (2)
public class PlainStyle implements Peppery {
    // 实现 "不辣" 风格的方法
    public String style() {
        return "味道清淡, 很养胃...";
    }
}

// 测试类
public class Test {
    public static void main(String[] args) {
        // 下面将得到“辣味”的牛肉面
        AbstractNoodle noodle1 = new BeefMoodle(new PepperySytle());
        noodle1.eat();
        // 下面将得到“不辣”的牛肉面
        AbstractNoodle noodle2 = new BeefMoodle(new PlainStyle());
        noodle2.eat();
        // 下面将得到“辣味”的猪肉面
        AbstractNoodle noodle3 = new PorkyNoodle(new PepperySytle());
        noodle3.eat();
        // 下面将得到“不辣”的猪肉面
        AbstractNoodle noodle4 = new PorkyNoodle(new PlainStyle());
        noodle4.eat();
    }
}

0 件のコメント:

コメントを投稿